Je veux écrire un script shell Unix qui fera diverses logiques s'il y a une chaîne à l'intérieur d'une autre chaîne. Par exemple, si je suis dans un certain dossier, bifurquez. Quelqu'un pourrait-il me dire comment y parvenir? Si possible, je voudrais que ce ne soit pas spécifique au shell (c'est-à-dire pas seulement bash), mais s'il n'y a pas d'autre moyen, je peux me contenter de cela.
#!/usr/bin/env sh
if [ "$PWD" contains "String1" ]
then
echo "String1 present"
elif [ "$PWD" contains "String2" ]
then
echo "String2 present"
else
echo "Else"
fi
CURRENT_DIR
est redondant; vous pouvez simplement utiliser$PWD
.Réponses:
Voici encore une autre solution. Cela utilise l' expansion des paramètres de sous-chaîne POSIX , donc cela fonctionne dans Bash, Dash, KornShell (ksh), Z shell (zsh), etc.
Une version fonctionnalisée avec quelques exemples:
la source
substring="$( printf '%q' "$2" )"
sauve la mise.[[ $haystack == *"My needle"* ]]
[]
. Voir ma réponse stackoverflow.com/a/54490453/712666 .Shell POSIX pur:
Les shells étendus comme ksh ou bash ont des mécanismes de correspondance sophistiqués, mais l'ancien style
case
est étonnamment puissant.la source
Malheureusement, je ne connais pas un moyen de faire cela dans sh. Cependant, en utilisant bash (à partir de la version 3.0.0, ce que vous avez probablement), vous pouvez utiliser l'opérateur = ~ comme ceci:
En prime (et / ou un avertissement, si vos chaînes contiennent des caractères amusants), = ~ accepte les expressions régulières comme opérande correct si vous omettez les guillemets.
la source
[[ test =~ "test.*" ]]
vs[[ test =~ test.* ]]
..la source
grep -q "$2"
pargrep -q "$2" > /dev/null
pour éviter une sortie indésirable.Voici un lien vers diverses solutions à votre problème.
C'est mon préféré car il a le sens le plus lisible par l'homme:
La méthode Star Wildcard
la source
sh
j'ai reçu "opérande inconnu" avec ceci. Fonctionne avec Bash cependant.[[
n'est pas POSIXla source
Il y a des expressions régulières Bash . Ou il y a 'expr':
la source
-> sortie: la chaîne 1 contient la chaîne 2
la source
Voir la page de manuel du programme 'test'. Si vous testez simplement l'existence d'un répertoire, vous feriez normalement quelque chose comme ceci:
Si vous essayez réellement de faire correspondre une chaîne, vous pouvez également utiliser des règles d'expansion bash et des caractères génériques:
Si vous avez besoin de faire quelque chose de plus complexe, vous devrez utiliser un autre programme comme expr.
la source
Dans les cas particuliers où vous voulez savoir si un mot est contenu dans un long texte, vous pouvez parcourir le long texte avec une boucle.
C'est un pur shell Bourne.
la source
Si vous voulez une méthode ksh seulement aussi rapide que "test", vous pouvez faire quelque chose comme:
Cela fonctionne en supprimant l'aiguille de la botte de foin, puis en comparant la longueur de chaîne des anciennes et des nouvelles meules de foin.
la source
test
? Comme dansreturn [ ${#haystack} -eq ${#1} ]
?