Как написать скрипт, который работает с аргументами или без них?

У меня есть сценарий bash, который выглядит примерно так:

#!/bin/bash if [ $1 = "--test" ] || [ $1 = "-t" ]; then echo "Testing..." testing="y" else testing="n" echo "Not testing." fi 

Итак, что я хочу сделать, это не только запустить его с ./script --test или ./script -t , но также без аргументов (только ./script ), но, похоже, если я сделаю это с текущим кодом выход просто:

 ./script: line 3: [: =: unary operator expected ./script: line 3: [: =: unary operator expected Not testing. 

Итак, как мне запрограммировать его, чтобы запустить его без каких-либо аргументов вообще, просто сделайте это, не бросая ошибку? Что я делаю не так?

Несколько путей; два наиболее очевидных:

  • Поместите $1 в двойные кавычки: if [ "$1" = "--test" ]
  • Проверьте количество аргументов, используя $ #

Еще лучше, используйте getopts.

Вы должны указать свои переменные в условии if. Заменить:

 if [ $1 = "--test" ] || [ $1 = "-t" ]; then 

с:

 if [ "$1" = '--test' ] || [ "$1" = '-t' ]; then 

Тогда он будет работать:

➜ ~ ./test.sh
Не тестирование.

Всегда всегда дважды указывайте свои переменные!

Вы используете bash. У Баша есть отличная альтернатива [ : [[ . С помощью [[ , вам не нужно беспокоиться о том, ссылаетесь ли на цитаты, и вы получаете гораздо больше операторов, чем [ , включая правильную поддержку || :

 if [[ $1 = "--test" || $1 = "-t" ]] then echo "Testing..." testing="y" else testing="n" echo "Not testing." fi 

Или вы можете использовать регулярные выражения:

 if [[ $1 =~ ^(--test|-t) ]] then echo "Testing..." testing="y" else testing="n" echo "Not testing." fi 

Конечно, правильное цитирование всегда должно быть сделано, но нет оснований придерживаться [ при использовании bash.

Проверить, присутствуют ли аргументы (в общем, и делать действия соответственно). Это должно работать:

 #!/bin/bash check=$1 if [ -z "$check" ]; then echo "no arguments" else echo "there was an argument" fi