Pierwszy oczywistą rzeczą jest należy podać spacji pomiędzy argumentami [, testczy [[:
if [ "$1" = 1 ];
W Bash [[ ]]zaleca się używanie, ponieważ nie robi rzeczy niepotrzebnych dla wyrażeń warunkowych, takich jak dzielenie słów i rozwijanie nazw ścieżek. Cytowanie wokół podwójnych cudzysłowów również nie jest potrzebne. ==Można również użyć bardziej czytelnego operatora .
if [[ $1 == 1 ]];
Dodano Uwaga: Jeśli drugi argument zawiera również zmienne, powołując jest konieczne, ponieważ może to być przedmiotem wyszukiwania wzorca, jeśli zawiera rozpoznawalne znaki takie jak *, ?, []itp .. Jeśli rozszerzony globbing lub pasujące do wzorca jest włączona shopt -s extglob, inne formy podoba @(), !()itp będą również rozpoznawane jako wzory. Zobacz Dopasowywanie wzorów .
Z operatorami podobnymi <i >może być to nadal konieczne, ponieważ kiedyś napotkałem błąd, w którym brak podania drugiego argumentu spowodował różne wyniki.
Jeśli chodzi o pierwszy operand, nic nie ma zastosowania.
Rozważ również tę prostszą odmianę:
case "$1" in
1)
mv -- "${@:2}" ~/lab/Sun
;;
2)
mv -- "${@:2}" ~/lab/Moon
;;
3)
mv -- "${@:2}" ~/lab/Earth
;;
esac
Lub skondensowane:
case "$1" in
1) mv -- "${@:2}" ~/lab/Sun ;;
2) mv -- "${@:2}" ~/lab/Moon ;;
3) mv -- "${@:2}" ~/lab/Earth ;;
esac
"${@:2}"jest formą rozszerzenia podłańcucha lub rozszerzenia elementu tablicy, gdzie 2jest przesunięcie. To powoduje, że ekspansja rozpoczyna się od drugiej wartości. Dzięki temu możemy nie musieć korzystać shift.
Dodane --zapobiega mvrozpoznawaniu nazw plików rozpoczynających się od dash ( -) jako niepoprawne opcje.
$var,$(cmd)a nawet`cmd`[do których$(cmd)należy preferować]). Są przypadki skrajne, w których nie musisz cytować, ale zawsze robienie tego nie zaszkodzi.