#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 пуст.