Los nuevos operadores ;&
y ;;&
se introdujeron en Bash
4.0 y aunque ambos pueden ser útiles en situaciones similares, creo no sirven de nada en tu caso. Esto es lo que man bash
dice sobre estos operadores:
If the ;; operator is used, no subsequent matches are attempted after the first pattern match. Using ;& in place of ;; causes execution to continue with the list associated with the next set of patterns. Using ;;& in place of ;; causes the shell to test the next pattern list in the statement, if any, and execute any associated list on a successful match.
En otras palabras, ;&
es una caída y, como sabemos por C
y ;;&
hace que bash
verifique los casos restantes en lugar de regresar de case
bloque por completo. Puede encontrar un buen ejemplo de ;;&
en acción aquí:https://stackoverflow.com/a/24544780/3691891.
Dicho esto, ni ;&
ni ;;&
podrían usarse en su script porque ambos irían a *)
que siempre se ejecutaría.
El siguiente script funciona y hace lo que quieres sin volver a -arreglar la lógica, pero considéralo solo como un ejemplo y nunca confíes en él,es demasiado frágil. he tomado la idea de aquí:
#!/usr/bin/env bash
function jumpto
{
label=$1
cmd=$(sed -n "/$label:/{:a;n;p;ba};" "$0" | grep -v ':$')
cmd=$(echo "$cmd" | sed 's,;;,,')
cmd=$(echo "$cmd" | sed 's,esac,,')
eval "$cmd"
}
input="foo"
VAR="1"
case $input in
foo)
if [ $VAR = "1" ]; then
printf "perform fallthrough\n"
jumpto ft
else
printf "do not perform fallthrough\n"
fi
;;
*)
ft:
echo "fallthrough worked!"
;;
esac
Укажите все имена файлов в файле. Ниже упомянутая команда переместит все имена файлов в целевой каталог:
awk '{print "mv " " " $1 " " "/Destinationpath"}' filename|sh