Test de Shell pour find un motif dans une string

Je voulais juste requestr s'il y a un commandment qui fonctionnerait sur des obus communs (bash, dash, kornshell)? Il est censé vérifier si la variable de line contient une partie du path.

 if [[ $line =~ "$PWD"$ ]] ;then 

Oui, les versions récentes de bash peuvent le faire:

 $ pwd /home/terdon $ line="I'm in /home/terdon" $ [[ "$line" =~ "$PWD"$ ]] && echo yes yes 

La même syntaxe fonctionne dans zsh et ksh mais pas dans le tiret. Pour autant que je sache, tiret n'a pas de telles capacités.

Notez que votre regex vérifie si la variable $line se termine par $PWD . Pour vérifier si $PWD correspond à n'importe où dans $line , supprimez le $ :

 $ line="I'm in /home/terdon, are you?" $ [[ "$line" =~ "$PWD" ]] && echo yes yes 

Dans n'importe quel shell compatible POSIX, vous pouvez faire:

 case $line in (*"$PWD"*) # whatever your then block had ;;esac 

Cela fonctionne dans bash , dash , et à peu près n'importe quel autre shell que vous pouvez nommer.

Il peut également être utilisé pour gérer de multiples possibilités facilement. Par exemple:

 case $line in (*"$PWD"*) echo \$PWD match\! ;; (*"$OLDPWD"*) echo \$OLDPWD match\! ;; (*) ! echo no match\! ;;esac 

Vous pouvez également utiliser l'alternance:

 case $line in (*"$PWD"*|*"$OLDPWD"*) echo '$OLDPWD|$PWD match!' ;;esac 

Notez l'utilisation de la citation ci-dessus:

  1. case $line ...
    • L'object d'une déclaration de case ne sera pas partagé sur $IFS ou sera utilisé comme model pour le nom de file gen. Ceci est similaire à la façon dont l'argument de gauche dans un [[ test est traité.
  2. (*"$PWD"*)
    • Ici aussi, une expansion de shell n'est pas soumise à la génération de nom de file $IFS ou de nom de file – une extension non-cotée ne sera ni divisée ni glob.
    • Mais une expansion non citée ici peut être interprétée comme un model plutôt qu'une string littérale, et donc une expansion peut signifier plus d'une chose selon qu'elle est ou non citée.
    • Il est important de citer toute variable utilisée dans un model qui devrait être interprétée littéralement, de la même manière que vous citeriez des caractères de model que vous vouliez interpréter littéralement.
    • Par exemple, si $PWD contenait un * et n'était pas cité, il serait interprété comme un object pattern et non comme un littéral * à searchr.