Je cherche un moyen de faire en sorte que la chute se produise en fonction d'une condition if dans une condition de cas dans bash. Par exemple:
input="foo"
VAR="1"
case $input in
foo)
if [ $VAR = "1" ]; then
# perform fallthrough
else
# do not perform fallthrough
fi
;;
*)
echo "fallthrough worked!"
;;
esac
Dans le code ci-dessus, si la variable VAR
est 1
, je voudrais que la condition de casse soit exécutée.
bash
shell-script
case
Smashgen
la source
la source
if [ $VAR -eq 1 ]; then
partie du code à ce qu'il contient*)
? Parce que c'est complètement différent de ce que l'on appelle la solution, ce qui rend la formulation de votre question légèrement trompeuse.Réponses:
Tu ne peux pas. La façon d'avoir une
case
chute est de remplacer le;;
séparateur par;&
(ou;;&
). Et c'est une erreur de syntaxe de mettre cela dans un if.Vous pouvez écrire toute la logique comme conditionnelle régulière:
la source
if
.Je suggère de restructurer votre logique: mettez plutôt le code "fallthrough" dans une fonction:
les sorties
la source
Le script suivant transforme votre test "à l'envers" dans le sens où nous testons d'
$var
abord, puis effectuons la solution (en utilisant;&
acase
) en fonction de$input
.Nous faisons cela parce que la question de savoir si ou non « effectuer la fallthrough » dépend vraiment seulement
$input
si$var
est1
. S'il s'agit d'une autre valeur, il n'est même pas nécessaire de se poser la question de savoir si faire la solution.Ou, sans
case
:la source
*)
. J'ai déjà mon +1.Pas quelque chose que je ferais, mais vous pourriez réaliser quelque chose avec:
la source
Testez les deux variables à la fois (bash 4.0-alpha +):
Lors des tests:
Propre et simple.
Comprenez que la valeur testée (
$new
) ne doit avoir que deux valeurs possibles, c'est pourquoi la clause if est là, pour transformer VAR en valeur booléenne. Si VAR peut devenir un booléen, testez0
(pas1
) dans lecase
et supprimez leif
.la source
Vous pouvez définir la valeur par défaut, mais placer une condition selon laquelle le code ne s'exécute que si la condition est remplie
Mais comme ilkkachu l'a suggéré, vous pouvez également utiliser des conditions plutôt que de changer.
la source
Si cela ne vous dérange pas que quelqu'un se plaint de ne pas comprendre votre code, vous pouvez simplement changer l'ordre des deux conditions:
Ou:
Simple et clair (du moins pour moi).
case
ne prend pas en charge la solution elle-même. Mais vous pouvez remplacer*)
par&&
afteresac
pour le faire respecter les valeurs de retour des autres branches.la source
De nouveaux opérateurs
;&
et;;&
ont été introduits dans la versionBash
4.0 et bien qu'ils puissent tous deux être utiles dans des situations similaires, je pense qu'ils ne sont d'aucune utilité dans votre cas. Voici ce queman bash
disent ces opérateurs:En d' autres termes,
;&
est une chute à travers et comme nous le savons à partirC
et;;&
marquesbash
vérifier cas restants au lieu de retourner ducase
bloc entièrement. Vous pouvez trouver un bel exemple de;;&
en action ici: /programming//a/24544780/3691891 .Cela étant dit, ni l'un
;&
ni l' autre ne;;&
peuvent être utilisés dans votre script car les deux y iraient et*)
seraient toujours exécutés.Le script suivant fonctionne et fait ce que vous voulez sans réorganiser la logique, mais ne le considérez que comme un exemple et ne vous y fiez jamais, il est trop fragile. J'ai pris l'idée d' ici :
la source
jumpto
fonction et exécute tout ce qui vient après. Le fait que cela équivaut à poursuivre l'exécution après le bloc entreft:
et;;
est une coïncidence carjumpto
c'est la dernière commande de la même commande complexe que le bloc sauté.