Во- первых очевидно , что это вы должны обеспечить пробелы между аргументами [, testили [[:
if [ "$1" = 1 ];
В Bash [[ ]]рекомендуется использовать, так как он не делает ненужных вещей для условного выражения, таких как разбиение слов и расширение пути. Цитировать вокруг двойных кавычек тоже не нужно. Также ==может быть использован более читаемый оператор .
if [[ $1 == 1 ]];
Добавлено примечание: Если второй операнд также содержит переменные, цитирует необходимо , так как это может быть при условии сопоставления с образцом , если он содержит узнаваемые символы , такие как *, ?, []и т.д .. Если расширенная подстановки или соответствующий шаблон включен shopt -s extglob, другие формы , как @(), !()и т.д. также будет распознаваться как шаблоны. Смотрите Pattern Matching .
С такими операторами, как <и >это, все еще может быть необходимо, поскольку я однажды столкнулся с ошибкой, при которой не цитирование второго аргумента приводило к другим результатам.
Что касается первого операнда, ничего не применяется.
Рассмотрим и этот более простой вариант:
case "$1" in
1)
mv -- "${@:2}" ~/lab/Sun
;;
2)
mv -- "${@:2}" ~/lab/Moon
;;
3)
mv -- "${@:2}" ~/lab/Earth
;;
esac
Или сжатый:
case "$1" in
1) mv -- "${@:2}" ~/lab/Sun ;;
2) mv -- "${@:2}" ~/lab/Moon ;;
3) mv -- "${@:2}" ~/lab/Earth ;;
esac
"${@:2}"является формой расширения подстроки или расширения элемента массива, где 2это смещение. Это заставляет расширение начинаться со второго значения. С этим нам, возможно, не понадобится пользоваться shift.
Добавленное --предотвращает mvраспознавание имен файлов, начинающихся с dash ( -), как недопустимых параметров.
$var,$(cmd)и даже`cmd`[которым$(cmd)следует отдавать предпочтение]). Есть некоторые крайние случаи, когда вам не нужно цитировать, но всегда делать это не повредит.