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.