La première chose évidente est que vous devez fournir des espaces entre les arguments de [
, test
ou [[
:
if [ "$1" = 1 ];
Dans Bash, l'utilisation [[ ]]
est recommandée car elle ne fait pas de choses inutiles pour l'expression conditionnelle comme le fractionnement de mots et l'expansion de noms de chemin. Il n'est pas non plus nécessaire de citer des guillemets doubles. Un opérateur plus lisible ==
peut également être utilisé.
if [[ $1 == 1 ]];
Ajout d'une note: Si un deuxième opérande contient également des variables, citant est nécessaire car il peut être soumis à la correspondance de motif si elle contient des caractères reconnaissables comme *
, ?
, []
, etc .. si elle était étendue englobement ou correspondance de motif est activé avec shopt -s extglob
, d' autres formes comme @()
, !()
, etc. seront également reconnus comme des modèles. Voir Correspondance de motifs .
Avec des opérateurs comme <
et >
cela peut encore être nécessaire car j'avais rencontré un bug où ne pas citer le deuxième argument provoquait des résultats différents.
Quant au premier opérande, rien ne s'applique.
Considérez également cette variante plus simple:
case "$1" in
1)
mv -- "${@:2}" ~/lab/Sun
;;
2)
mv -- "${@:2}" ~/lab/Moon
;;
3)
mv -- "${@:2}" ~/lab/Earth
;;
esac
Ou condensé:
case "$1" in
1) mv -- "${@:2}" ~/lab/Sun ;;
2) mv -- "${@:2}" ~/lab/Moon ;;
3) mv -- "${@:2}" ~/lab/Earth ;;
esac
"${@:2}"
est une forme d'extension de sous-chaîne ou d'extension de membre de tableau où 2
est le décalage. Cela fait démarrer l'expansion à la deuxième valeur. Avec cela, nous n'aurons peut-être pas besoin d'utiliser shift
.
L'ajout --
empêche mv
de reconnaître les noms de fichiers commençant par dash ( -
) comme des options invalides.
$var
,$(cmd)
et même`cmd`
[auquel$(cmd)
devrait être préféré]). Il y a des cas limites où vous ne devez citer, mais toujours le faire ne fera pas mal.