La prima cosa ovvia è che dovresti fornire spazi tra gli argomenti di [
, test
o [[
:
if [ "$1" = 1 ];
Quando sei in Bash, [[ ]]
si consiglia di utilizzare in quanto non fa cose inutili per l'espressione condizionale come la suddivisione delle parole e l'espansione del percorso. Non è inoltre necessario citare virgolette doppie. È ==
inoltre possibile utilizzare un operatore più leggibile .
if [[ $1 == 1 ]];
Aggiunta di una nota: se secondo operando contiene anche variabili, citando è necessario in quanto può essere soggetto a pattern matching se contiene caratteri riconoscibili come *
, ?
, []
, ecc .. Se il globbing esteso o pattern matching viene abilitata con shopt -s extglob
, altre forme come @()
, !()
ecc saranno anche riconosciuti come modelli. Vedi Corrispondenza dei motivi .
Con operatori simili <
e >
potrebbe essere ancora necessario, poiché una volta avevo riscontrato un bug in cui non citare il secondo argomento causava risultati diversi.
Per quanto riguarda il primo operando, non si applica nulla.
Considera anche questa variazione più semplice:
case "$1" in
1)
mv -- "${@:2}" ~/lab/Sun
;;
2)
mv -- "${@:2}" ~/lab/Moon
;;
3)
mv -- "${@:2}" ~/lab/Earth
;;
esac
O condensato:
case "$1" in
1) mv -- "${@:2}" ~/lab/Sun ;;
2) mv -- "${@:2}" ~/lab/Moon ;;
3) mv -- "${@:2}" ~/lab/Earth ;;
esac
"${@:2}"
è una forma di espansione della sottostringa o espansione dei membri dell'array in cui si 2
trova l'offset. Questo fa iniziare l'espansione dal secondo valore. Con questo potrebbe non essere necessario utilizzare shift
.
L'aggiunta --
impedisce mv
di riconoscere i nomi di file che iniziano con trattino ( -
) come opzioni non valide.
$var
,$(cmd)
, e anche`cmd`
[a cui$(cmd)
dovrebbe essere preferito]). Ci sono alcuni casi limite in cui non dovete citare, ma sempre facendo non farà male.