Как проверить, являются ли $ 1 и $ 2 равными нулю?

Я запускаю некоторый скрипт, который передает строковый аргумент, и я хочу выполнить оператор 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"; Заданы обе переменные, но одна из них равна нулю.