сценарий оболочки, если выполняется независимо ни от чего

#sh

#sh

Вопрос:

почему в этом сценарии

 #!/bin/sh

if [ $1='all' ];
then
    echo $1
    echo "all"
fi
 

все печатается независимо от того, что???

Например, я делаю: ./thescript.sh и я понял, что $ 1 пуст. Но все равно все печатается. Почему? И как я могу напечатать «все», когда все передано

Комментарии:

1. Просто предупреждаю… возможно, вы предпочтете использовать #!/usr/bin/env sh вместо #!/bin/sh . Смотрите Здесь для получения дополнительной информации о различиях

Ответ №1:

у shellcheck есть решение:

SC2077: вам нужны пробелы вокруг оператора сравнения.

Изменить на

 if [ $1 = 'all' ];
 

Без пробелов объект между [ и ] обрабатывается как одно выражение и man [ говорит

«СТРОКА, эквивалентная -n STRING

таким образом, рассматривается любая непустая строка true . (т. Е. if [ "" ]; Будет false .)

Тем не менее, вам лучше указать, какую оболочку вы хотите в shebang. В некоторых системах /bin/sh может быть bash , в других /bin/dash или что-то еще. Выберите свою оболочку и избегайте любых проблем из-за неверных предположений о том, какую оболочку вы на самом деле получаете.

Комментарии:

1. Если я это сделаю, я получу [: =: unexpected operator

2. Какую оболочку вы на самом деле используете? ls -l /bin/sh или sh --version какой аргумент вы передаете? Ничего? Тогда $1 пусто, и весь термин недействителен. Попробуйте заключить в кавычки $1 : if [ "$1" = 'all' ]; … на другую проблему указал бы shellcheck.

3. Я просто понимаю. Оболочка, которую я использую, чтобы попробовать это, кажется, dash. Но тот, который я собираюсь использовать для представления этого, — это bash! ооооо мой…

Ответ №2:

Заключите переменную в двойные кавычки:

    #!/bin/sh

   if [ "$1" == "all" ];
   then
       echo $1
       echo "all"
   fi 
 

Комментарии:

1.Что еще более важно, отделите = (not == ) от двух строк для сравнения.

2.( [ $1 = all ] может работать по назначению, если $1 не является пустым или не заданным; "$1"=all никогда не будет работать по назначению.)

3. И когда $ 1 пуст (как в примере в этом вопросе), сообщение об ошибке выглядит как «[: =: ожидается унарный оператор». Помещение кавычек вокруг «$ 1» не приведет к этой ошибке, если $ 1 пуст.