web-dev-qa-db-fra.com

Comment vérifier si une chaîne a des espaces dans le shell Bash

Dites qu'une chaîne pourrait être comme "a b '' c '' d". Comment puis-je vérifier que la chaîne contient des guillemets simples/doubles et de l'espace?

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

Vous pouvez utiliser des expressions régulières dans bash:

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

Modifier:

Pour des raisons évidentes ci-dessus, il est préférable de mettre l'expression rationnelle dans une variable:

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

Et les guillemets ne sont pas nécessaires entre doubles crochets. Ils ne peuvent pas être utilisés à droite ou l'expression régulière est changée en chaîne littérale.

26
Dennis Williamson
[[ "$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

Vous pouvez le faire sans recourir à des barres obliques inverses ni à des commandes externes:

# 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

En relation:

5
codeforester

La manière portable de faire ceci est avec grep:

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

... un peu moche, mais garanti de fonctionner partout.

4
alex tingle

Que diriez-vous d'une approche similaire à:

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

?

2
Grzegorz Oledzki
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

rendements:

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

Et ça:

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

ou si vous aimez ceci: 

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

Explication: J'évalue une comparaison entre la variable $ {var} et la variable $ {var} elle-même après la substitution à la volée d'une chaîne non destructive de tous les guillemets et espaces avec un souligner. 

Exemples:  

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

Le code suivant remplace tous les caractères entre les crochets (espace et guillemets) par un trait de soulignement. Notez que les guillemets doivent être protégés avec une barre oblique inverse: 

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

Je sais que ce fil a été créé il y a 9 ans, mais j'aimerais proposer mon approche. Toutes les réponses, y compris la réponse principale, semblent être un travail supplémentaire. Pourquoi ne pas l'approcher simplement ...

echo "\"$var\""
0
sudosysadmin

Je me demande pourquoi personne n'a mentionné l'ensemble [: space:]. Habituellement, vous n'êtes pas seulement intéressé par la détection du caractère d'espace. J'ai souvent besoin de détecter tout espace blanc, par ex. LANGUETTE. L'exemple "grep" ressemblerait à ceci:

$ 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.