Я запускаю некоторый скрипт, который передает строковый аргумент, и я хочу выполнить оператор if else, показанный ниже:
if [ $1 != '' ] && [ $2 != '' ]then do something.....
но это показало Error too many argument
. Почему?
Я запускаю некоторый скрипт, который передает строковый аргумент, и я хочу выполнить оператор if else, показанный ниже:
if [ $1 != '' ] && [ $2 != '' ]then do something.....
но это показало Error too many argument
. Почему?
Попробуйте использовать тест -z:
if [ -z "$1" ] && [ -z "$2" ]
От человека bash
:
-z string True if the length of string is zero.
Поскольку это помечено bash
, я рекомендую использовать расширенная тестовая конструкция ([[...]]
), и забудьте о цитатах:
if [[ -z $1 && -z $2 ]]; then...
Если только вы не собираетесь за sh
/ Совместимость с POSIX, нет причин не использовать [[ ]]
.
Также работает следующее,
if [ "$1" == "" && "$2" == ""]; then echo NULLfi
Я думаю, что название сообщения неточно, так как намерение в сообщении состояло в том, чтобы проверить, не равны ли $ 1 и $ 2 нулю.В приведенном примере просто не хватало двойных кавычек в $ 1 и $ 2 для работы. Переменные должны быть заключены в двойные кавычки, чтобы их можно было расширять при сравнении строк.Но проверить, существуют ли $ 1 и $ 2, - это то же самое, что проверить, существует ли $ 2, поскольку он не может существовать, если $ 1 не существует. Команда 'if' также не нужна в этом случае, так как 'test' возвращает true/false и использует '&&' как 'then', если возвращаемое значение равно 0/true:
[ "$2" != '' ] && commands...
Проще, с -n (ненулевым):
[ -n "$2" ] && commands...
Чтобы "проверить, являются ли $ 1 и $ 2 нулевыми", было бы то же самое, что проверить, нет ли параметра:
[ $# -eq 0 ] && commands...
Старую версию ответа смотрите во второй части этого ответа. Если вы хотите узнать подробности, читайте дальше
В самом вопросе сообщается, что ОП видит too many arguments error
, который при испытании в bash
похоже, это не так:
$ [ $1 != '' ] && [ $2 != '' ]bash: [: !=: unary operator expected
С /bin/sh
который на самом деле имеет символическую ссылку на /bin/dash
в Ubuntu сообщение об ошибке выглядит следующим образом:
$ sh$ [ $1 != '' ] && [ $2 != '' ]sh: 1: [: !=: unexpected operator
И автономный /bin/test
тоже :
$ /usr/bin/test $1 != '' /usr/bin/test: missing argument after ‘’
Примечание: Если вам интересно, что такое /usr/bin/test
и почему я использую bash
и sh
, тогда вы должны знать, что [
является псевдонимом для test
команда, которая также существует как автономный исполняемый файл или, чаще всего, как встроенная оболочка, которую каждая оболочка будет использовать в первую очередь. Что касается if
операторы, они работают на статуях выхода команд, следовательно, почему [
и test
являются командами, а все остальное является аргументами для этих команд - неправильный порядок этих аргументов командной строки приводит к ошибкам.
Возвращаясь к теме: неясно, как OP получил несвязанную ошибку. Однако во всех 3 случаях проблема одна и та же - переменная без кавычек будет рассматриваться как пустая, поэтому оболочка видит с этими переменными без кавычек следующее
[ != '' ]
который нарушает синтаксис, который test
понимает. Помните, что я говорил о неправильном порядке аргументов командной строки? Отсюда и важность цитирования. Давайте включим диагностический вывод и посмотрим, что выполняет оболочка:
$ set -x# throws error$ [ $1 != '' ] && [ $2 != '' ] + '[' '!=' '' ']'bash: [: !=: unary operator expected# no error$ [ "$1" != '' ] && [ "$2" != '' ] || echo null vars+ '[' '' '!=' '' ']'+ echo null varsnull vars
Очень частый подход, который вы видите вокруг, заключается в следующем:
if [ "x$var1" == "x" ] && [ "x$var2" == "x" ]; then echo "both variables are null" fi
Процитировать Жиль:
В [ "x$ 1" = "x" ] префикс x гарантирует, что x"$ 1" никак не может выглядеть как оператор, и поэтому единственный способ, которым оболочка может проанализировать этот тест, - это обработать = как двоичный оператор.
Предположительно, это должно быть довольно портативно, так как я видел это в /bin/sh
скрипты. Он также может быть объединен, как в
if [ "x${var1}${var2}" == "x" ]; then ...fi
Конечно, мы могли бы использовать -z
флаг, однако, согласно исследованиям в некоторых снарядах, в частности ksh88 (согласно Стефан Шазелас), этот флаг неисправен.
Вы должны использовать [[ ]]
. В противном случае вам придется заключать свои переменные в кавычки.
Вы должны предоставить 1. команду, которую вы вызываете скриптом, и 2. полный вывод.
Если бы $ 1 не существовало, то $ 2 стало бы $ 1, что делает тест на то, что $ 1 и $ 2 равны нулю, кажущимся неуместным.
@WinEunuuchs2Unix Не обязательно не имеет значения - в некоторых случаях вы хотите убедиться, что в аргументах действительно есть что-то вместо пустой или нулевой строки. $1
может быть сброшен или установлен в нулевую строку пользователем скрипта. Рассмотрим следующую последовательность команд: $ set " bar
затем echo "x${1}x";
Заданы обе переменные, но одна из них равна нулю.