По- перше очевидно , що це ви повинні забезпечити прогалини між аргументами [, testабо [[:
if [ "$1" = 1 ];
Якщо в Bash, використання [[ ]]рекомендується, оскільки це не робить непотрібних для умовного вираження, таких як розділення слів і розширення імені шляху. Цитування подвійних лапок також не потрібно. ==Можна також скористатися більш читаним оператором .
if [[ $1 == 1 ]];
Додано примітка: Якщо другий операнд також містить змінні, цитує необхідно , так як це може бути при умови зіставлення з зразком , якщо він містить впізнавані символи , такі як *, ?, []і т.д .. Якщо розширена підстановки або відповідний шаблон включений shopt -s extglob, інші форми , як @(), !()і т.д. також будуть визнані зразками. Дивіться відповідність шаблонів .
З такими операторами, як, <і >це все ще може знадобитися, оскільки я колись стикався з помилкою, коли не цитування другого аргументу спричинило різні результати.
Щодо першого операнда, то нічого не стосується.
Розглянемо також цю простішу варіацію:
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розпізнавати назви файлів, починаючи з тире ( -), як недійсні параметри.
$var,$(cmd)і навіть`cmd`[яким$(cmd)слід віддати перевагу]). Є деякі крайні випадки, коли не потрібно цитувати, але завжди робити це не зашкодить.