comment faire si les instructions avec “et” dans sh

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)$';