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