Die erste offensichtliche Sache ist , Sie Räume zwischen den Argumenten liefern sollten [
, test
oder [[
:
if [ "$1" = 1 ];
In Bash wird die Verwendung [[ ]]
empfohlen, da hierdurch keine für bedingte Ausdrücke unnötigen Funktionen wie Wortaufteilung und Pfadnamenerweiterung erforderlich sind. Das Zitieren um doppelte Anführungszeichen ist ebenfalls nicht erforderlich. Ein besser lesbarer Operator ==
kann ebenfalls verwendet werden.
if [[ $1 == 1 ]];
Hinzugefügt Anmerkung: Wenn zweiter Operand auch Variablen enthält, unter Angabe ist notwendig , da es je nach Musteranpassung sein kann , wenn es erkennbar Zeichen enthält wie *
, ?
, []
, etc .. Wenn die erweiterte Globbing oder Pattern - Matching aktiviert mit shopt -s extglob
, anderen Formen wie @()
, !()
usw. wird auch als Muster erkannt. Siehe Mustervergleich .
Bei Operatoren wie <
und >
kann es dennoch notwendig sein, da ich einmal auf einen Fehler gestoßen war, bei dem das Nichtzitieren des zweiten Arguments zu unterschiedlichen Ergebnissen führte.
Für den ersten Operanden gilt nichts.
Betrachten Sie auch diese einfachere Variante:
case "$1" in
1)
mv -- "${@:2}" ~/lab/Sun
;;
2)
mv -- "${@:2}" ~/lab/Moon
;;
3)
mv -- "${@:2}" ~/lab/Earth
;;
esac
Oder verdichtet:
case "$1" in
1) mv -- "${@:2}" ~/lab/Sun ;;
2) mv -- "${@:2}" ~/lab/Moon ;;
3) mv -- "${@:2}" ~/lab/Earth ;;
esac
"${@:2}"
ist eine Form der Teilstringerweiterung oder Arrayelementerweiterung, wobei 2
der Versatz ist. Dadurch beginnt die Erweiterung beim zweiten Wert. Damit müssen wir möglicherweise nicht verwenden shift
.
Das hinzugefügte --
verhindert, mv
dass Dateinamen, die mit dash ( -
) beginnen, als ungültige Optionen erkannt werden .
$var
,$(cmd)
und sogar`cmd`
[zu denen$(cmd)
bevorzugt werden sollte]). Es gibt einige Grenzfälle , wo man nicht haben , zu zitieren, aber immer tut es nicht schaden.