Я запускаю некоторый скрипт, который передает строковый аргумент, и я хочу сделать, если оператор else, как показано ниже:
if [ $1 != '' ] && [ $2 != '' ]
then
do something.....
но это показано Error too many argument
. Зачем?
command-line
bash
scripts
тайминдис вун
источник
источник
[[ ]]
. В противном случае вы должны указать свои переменные.$1
может быть сброшен или установлен на пустую строку пользователем скрипта. Рассмотрим следующую последовательность команд:$ set '' bar
затемecho "x${1}x";
обе переменные установлены, но одна из них равна нулю.Ответы:
Попробуйте использовать тест -z:
От мужчины
bash
:источник
Поскольку это помечено
bash
, я рекомендую использовать расширенную тестовую конструкцию ([[...]]
) и забыть кавычки:Если вы не собираетесь использовать
sh
/ POSIX-совместимость, нет причин не использовать[[ ]]
.источник
Следующее также работает,
источник
&&
И другие логические команды разделители не допускаются в классическийtest
. Вместо этого вы должны использовать другие тестовые конструкции (например-a
, я думаю)Для старой версии ответа см. Вторую часть этого ответа. Если вы хотите узнать о деталях, читайте дальше
Причина проблемы
В самом вопросе сообщается, что OP видит
too many arguments error
, что при тестированииbash
не выглядит так:С
/bin/sh
которой на самом деле есть символическая ссылка/bin/dash
на Ubuntu, ошибка сообщается следующим образом:И автономный
/bin/test
также:Sidenote: Если вам интересно, что
/usr/bin/test
и для чего я используюbash
иsh
, тогда вы должны знать, что[
это псевдоним дляtest
команды, который также существует как автономный исполняемый файл или чаще - как встроенная оболочка, которую каждая оболочка будет использовать первой. , Что касаетсяif
операторов, они действуют на состояниях выхода команд, следовательно, почему[
иtest
являются командами, а все остальное является аргументами этих команд - неправильный порядок этих аргументов командной строки приводит к ошибкам.Вернемся к теме: неясно, как ОП получил несвязанную ошибку. Однако во всех трех случаях проблема одна и та же - неустановленная переменная будет считаться пустой, поэтому оболочка с этими переменными без кавычек выглядит так:
который нарушает синтаксис, который
test
понимает. Помните, что я сказал о неправильном порядке аргументов командной строки? Следовательно, почему цитирование важно. Давайте включим диагностический вывод и посмотрим, какая оболочка выполняется:Лучший способ проверить неустановленные переменные
Очень часто встречающийся подход заключается в следующем:
Процитирую Жиля :
Предположительно, это должно быть довольно переносимо, так как я видел это в
/bin/sh
скриптах. Это также может быть объединено как вКонечно, мы могли бы использовать
-z
флаг, однако, согласно исследованиям в некоторых оболочках, в частности, ksh88 (согласно Стефану Чазеласу ), этот флаг неисправен.Смотрите также
\[
против\[\[
против((
источник
Я думаю, что название поста не является точным, так как в сообщении намеревалось проверить, не равны ли $ 1 и $ 2 значения NULL. В данном примере просто не хватало двойных кавычек в $ 1 и $ 2 для работы. Переменные должны быть заключены в двойные кавычки, чтобы их можно было расширить при сравнении строк. Но проверить, существуют ли $ 1 и $ 2, - это то же самое, что проверить, существуют ли $ 2, поскольку он не может существовать, если $ 1 не существует. Команда 'if' также не требуется в этом случае, так как 'test' возвращает true / false и использует '&&' как 'then', если return равно 0 / true:
Проще, с -n (отличным от нуля):
«Проверить, равны ли $ 1 и $ 2 нулю», было бы то же самое, что проверить, нет ли параметра:
источник