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?
case "$var" in
*\ * )
echo "match"
;;
*)
echo "no match"
;;
esac
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.
[[ "$str" = "${str%[[:space:]]*}" ]] && echo "no spaces" || echo "has spaces"
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
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:
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.
Que diriez-vous d'une approche similaire à:
$ A="some string"; echo $A | grep \ | wc -l
1
$ A="somestring"; echo $A | grep \ | wc -l
0
?
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
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//[ \"]/_}
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\""
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