wake-up-neo.com

So prüfen Sie, ob eine Zeichenfolge Leerzeichen in der Bash-Shell enthält

Angenommen, ein String könnte wie "a b '' c '' d" sein. Wie kann ich überprüfen, ob der String ein einfaches/doppeltes Anführungszeichen und Leerzeichen enthält?

24
derrdji
case "$var" in  
     *\ * )
           echo "match"
          ;;
       *)
           echo "no match"
           ;;
esac
22
Steve B.

Sie können reguläre Ausdrücke in bash verwenden:

string="a b '' c '' d"
if [[ "$string" =~ \ |\' ]]    #  slightly more readable: if [[ "$string" =~ ( |\') ]]
then
   echo "Matches"
else
   echo "No matches"
fi

Bearbeiten:

Aus oben genannten Gründen ist es besser, den Regex in eine Variable zu setzen:

pattern=" |'"
if [[ $string =~ $pattern ]]

In doppelten eckigen Klammern sind keine Anführungszeichen erforderlich. Sie können nicht rechts verwendet werden, oder die Regex wird in eine Literalzeichenfolge geändert.

26
[[ "$str" = "${str%[[:space:]]*}" ]] && echo "no spaces" || echo "has spaces"
9
glenn jackman
string="a b '' c '' d"
if [ "$string" == "${string//[\' ]/}" ]
then 
   echo did not contain space or single quote
else
   echo did contain space or single quote
fi
7
Paul

Sie können dies tun, ohne dass Sie umgekehrte Schrägstriche oder externe Befehle benötigen:

# string matching

if [[ $string = *" "* ]]; then
  echo "string contains one more spaces"
else
  echo "string doesn't contain spaces"
fi

# regex matching

re="[[:space:]]+"
if [[ $string =~ $re ]]; then
  echo "string contains one or more spaces"
else
  echo "string doesn't contain spaces"
fi

Verbunden:

5
codeforester

Der tragbare Weg, dies zu tun, ist mit grep:

S="a b '' c '' d"
if echo $S | grep -E '[ "]' >/dev/null
then
  echo "It's a match"
fi

... etwas hässlich, aber garantiert überall funktionieren.

4
alex tingle

Wie wäre es mit einem Ansatz ähnlich zu:

$ A="some string"; echo $A | grep \  | wc -l
1
$ A="somestring"; echo $A | grep \  | wc -l
0

?

2
function foo() {
    echo "String: $*"
    SPACES=$(($#-1))
    echo "Spaces: $SPACES"
    QUOTES=0
    for i in $*; do
        if [ "$i" == "'" ]; then
            QUOTES=$((QUOTES+1))
        fi
    done
    echo "Quotes: $QUOTES"
    echo
}

S="string with spaces"
foo $S
S="single' 'quotes"
foo $S
S="single '' quotes"
foo $S
S="single ' ' quotes"
foo $S

ergibt:

String: string with spaces
Spaces: 2
Quotes: 0

String: single' 'quotes
Spaces: 1
Quotes: 0

String: single '' quotes
Spaces: 2
Quotes: 0

String: single ' ' quotes
Spaces: 3
Quotes: 2
1
ezpz

Was ist mit diesem:

[[ $var == ${var//[ \"]/_} ]] && echo "quotes or spaces not found"

oder wenn dir das gefällt: 

if [[ $var == ${var//[ \"]/_} ]] ; then  
   echo "quotes or spaces not found" 
else
   echo "found quotes or spaces"
fi

Erläuterung: Ich evaluiere einen Vergleich zwischen der Variablen $ {var} und der Variablen $ {var} selbst nach einer fliegenden, zerstörungsfreien String-Ersetzung aller Anführungszeichen und Leerzeichen mit einem Unterstrich. 

Beispiele:  

${var// /_}  # Substitute all spaces with underscores

Im folgenden Code werden alle Zeichen zwischen den eckigen Klammern (Leerzeichen und Anführungszeichen) durch einen Unterstrich ersetzt. Beachten Sie, dass Anführungszeichen mit einem Backslash geschützt werden müssen: 

${var//[ \"]/_}  
0
rgiannico

Ich weiß, dass dieser Thread vor 9 Jahren erstellt wurde, aber ich möchte meine Herangehensweise anbieten. Alle Antworten, einschließlich der Top-Antwort, wirken wie zusätzliche Arbeit. Warum nicht einfach so ...

echo "\"$var\""
0
sudosysadmin

Ich wundere mich, warum niemand das [: space:] Set erwähnt hat. Normalerweise interessiert Sie nicht nur das Leerzeichen. Ich muss häufig Leerstellen erkennen, z. TAB. Das "grep" -Beispiel würde so aussehen:

$ echo " " | egrep -q "[:space:]" && echo "Has no Whitespace" || echo "Has Whitespace"
Has Whitespace
$ echo "a" | egrep -q "[:space:]" && echo "Has no Whitespace" || echo "Has Whitespace"
Has no Whitespace
0
dz.