Во- первых очевидно , что это вы должны обеспечить пробелы между аргументами [
, 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)
следует отдавать предпочтение]). Есть некоторые крайние случаи, когда вам не нужно цитировать, но всегда делать это не повредит.