Comment écrire et faire correspondre des expressions régulières dans le script / bin / sh?

J’écris un script shell pour un micro-kernel basé sur unix limité qui n’a pas de bash! le / bin / sh ne peut pas exécuter les lignes suivantes pour certaines raisons.

if [[ `uname` =~ (QNX|qnx) ]]; then read -p "what is the dev prefix to use? " dev_prefix if [[ $dev_prefix =~ ^[a-z0-9_-]+@[a-z0-9_-"."]+:.*$ ]]; then 

Pour les 1ère et 3ème lignes, il se plaint de l’absence d’opérateur d’expression, et pour la 2ème ligne, pas de coprocess! Quelqu’un peut-il éclairer les différences entre les scripts / bin / bash et / bin / sh?

Vous pouvez utiliser ce script équivalent dans /bin/sh :

 if uname | grep -Eq '(QNX|qnx)'; then printf "what is the dev prefix to use? " read dev_prefix if echo "$dev_prefix" | grep -Eq '^[a-z0-9_-]+@[a-z0-9_-"."]+:'; then ... fi fi 

Voici une méthode pour voir quelles sont les fonctionnalités non-Posix dans un script:

Copiez / collez ceci dans shellcheck.net:

 #!/bin/sh if [[ `1uname` =~ (QNX|qnx) ]]; then read -p "what is the dev prefix to use? " dev_prefix if [[ $dev_prefix =~ ^[a-z0-9_-]+@[a-z0-9_-"."]+:.*$ ]]; then : nothing fi fi 

Ou installez shellcheck localement, et lancez shellcheck ./check.sh , et il mettra en évidence les fonctionnalités non-posix:

 In ./check.sh line 2: if [[ `1uname` =~ (QNX|qnx) ]]; then ^-- SC2039: In POSIX sh, [[ ]] is not supported. ^-- SC2006: Use $(..) instead of deprecated `..` In ./check.sh line 4: if [[ $dev_prefix =~ ^[a-z0-9_-]+@[a-z0-9_-"."]+:.*$ ]]; then ^-- SC2039: In POSIX sh, [[ ]] is not supported. 

Vous devez soit réécrire les expressions en tant que globes (non réalistes), soit utiliser des commandes externes (grep / awk), expliquées par @anubhava.