Pierwszy oczywistą rzeczą jest należy podać spacji pomiędzy argumentami [
, test
czy [[
:
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 2
jest przesunięcie. To powoduje, że ekspansja rozpoczyna się od drugiej wartości. Dzięki temu możemy nie musieć korzystać shift
.
Dodane --
zapobiega mv
rozpoznawaniu 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.