J’essaie de résoudre ce problème avec le sh et pas le bash. Tout ce que je veux, c’est une instruction if qui vérifie certaines expressions rationnelles ET autre chose. Normalement en bash ce serait un travail facile mais avec le sh je ne trouve que des solutions en ligne qui ne fonctionnent pas pour moi
La première chose que je veux vérifier:
if echo "$1"| grep -E -q '^(\-t|\-\-test)$';
Que je veux vérifier:
if echo "$#"| grep -E -q '^(1|2)$';
Combiné:
if [ \(echo "$1"| grep -E -q '^(\-h|\-\-help)$'\) -a \(echo "$#"| grep -E -q '^(1|\2)$'\) ];
ERREUR:
grep: grep: ./parsinghtml.sh: 41: [: missing ] Invalid back reference (echo: No such file or directory grep: 1: No such file or directory
J’essaie aussi beaucoup de combinaisons différentes avec ces parenthèses mais aucune d’entre elles n’a fonctionné pour moi. Peut-être que quelqu’un peut m’aider ici 🙂
logique et entre les commandes est &&
if echo "$1"| grep -E -q '^(\-h|\-\-help)$' && echo "$#"| grep -E -q '^(1|\2)$';
Par défaut, le statut de sortie d’un canal correspond au statut de sortie de la dernière commande.
set -o pipefail
Le statut de sortie est échoué si une commande de pipe a un état de sortie d’échec.
lorsque seul le statut de sortie de la dernière commande d’une séquence doit être vérifié
if { command11; command12;} && { command21; command22;};
Cependant, pour vérifier les parameters, il n’est pas nécessaire de lancer un autre processus grep
avec un tube.
Pensez à utiliser les constructions suivantes avec n’importe quel POSIX sh.
if { [ "$1" = -h ] || [ "$1" = --help ];} && { [ $# -eq 1 ] || [ $# -eq 2 ];};
EDIT: La suite n’est pas POSIX mais peut fonctionner avec de nombreux shell
if [[ $1 = -h || $1 = --help ]] && [[ $# = 1 || $# = 2 ]];
Fonctionne aussi avec bash avec set -o posix
Peut-être que pour votre cas particulier, la correspondance de modèle pourrait être meilleure:
if [[ $1 =~ ^(\-h|\-\-help)$ && $# =~ ^(1|\2)$ ]]; then
Le problème avec votre commande est que la partie dans test
ou [
commande est une expression , pas une liste de commandes .
Donc, quand vous exécutez [ echo 'hello' ]
ou [ \( echo 'hello' \) ]
plaint d’une erreur malgré sh
ou Bash
. Reportez-vous à l’utilisation du test
classique: La commande de test classique
Et la syntaxe de if
est:
if list; then list; fi
Donc, vous pouvez simplement combiner une commande avec l’opérateur &&
dans les instructions if
:
if echo "$1"| grep -E -q '^(\-h|\-\-help)$' && echo "$#"| grep -E -q '^(1|\2)$';