Я запускаю какой-то скрипт, передающий строковый аргумент, и я хочу сделать оператор 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.
Следующее также работает,
if [ "$1" == "" && "$2" == ""]; then
echo NULL
fi
Так как это отмечено bash
, я рекомендую, чтобы одно использование расширенная тестовая конструкция ([[...]]
) , и забыло кавычки:
if [[ -z $1 && -z $2 ]]; then
...
, Если Вы не идете для sh
/ совместимость POSIX, нет никакой причины не использовать [[ ]]
.
Для старой версии ответа посмотрите вторую часть этого ответа. Если Вы хотите знать о деталях, продолжать читать
В самом вопросе сообщается, что OP видит too many arguments error
, который при тестировании в bash
кажется, не имеет место:
$ [ $1 != '' ] && [ $2 != '' ]
bash: [: !=: unary operator expected
С /bin/sh
который является на самом деле symlinked к /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
команды, при этом все остальное аргументы этому команды - неподходящий порядок тех, командная строка args приводит к ошибкам.
Назад к теме: неясно, как OP получила несвязанную ошибку. Однако во всех 3 случаях проблемой является то же - переменную сброса будут рассматривать как пустую, таким образом что оболочка видит с этими неупомянутыми переменными,
[ != '' ]
который повреждает синтаксис который test
понимает. Помните то, что я сказал о неподходящем порядке параметров командной строки? Следовательно, почему заключение в кавычки важно. Давайте включим диагностический вывод и посмотрим то, что выполняет оболочка:
$ set -x
# throws error
$ [ $1 != '' ] && [ $2 != '' ]
+ '[' '!=' '' ']'
bash: [: !=: unary operator expected
# no error
$ [ "$1" != '' ] && [ "$2" != '' ] || echo null vars
+ '[' '' '!=' '' ']'
+ echo null vars
null vars
Очень частый подход, который Вы видите вокруг, является этим:
if [ "x$var1" == "x" ] && [ "x$var2" == "x" ];
then
echo "both variables are null"
fi
Заключить Gilles в кавычки:
В ["1 x$" = "x"], x префикс гарантирует, что x" 1$" не может возможно быть похожим на оператор, и таким образом, единственный способ, которым оболочка может проанализировать этот тест, путем обработки = как бинарный оператор.
По-видимому, это должно быть довольно портативно, так как я видел их в /bin/sh
сценарии. Это также может быть объединено как в
if [ "x${var1}${var2}" == "x" ]; then
...
fi
Конечно, мы могли использовать -z
флаг, однако согласно исследованию в некоторых оболочках, особенно ksh88 (по словам Stephane Chazelas), этот флаг является дефектным.
Я думаю, что заголовок сообщения не точен, поскольку намерение в сообщении состояло в том, чтобы проверить, не являются ли 1$ и 2$ пустыми. Данный пример просто пропускал двойные кавычки в 1$ и 2$ для работы. Переменные должны быть двойные заключенный в кавычки, чтобы быть расширенными при сравнении строк. Но, проверить, существуют ли 1$ и 2$, совпадает с проверкой, если 2$ существуют, поскольку это не может существовать, если 1$ не делает. 'Если' команда также не нужна в этом случае, поскольку 'тест' возвращает true и использует '& &'; как 'затем', если возврат 0/верный:
[ "$2" != '' ] && commands...
Более простой, с (ненулевым)-n:
[ -n "$2" ] && commands...
, Чтобы "проверить, являются ли 1$ и 2$ пустыми", совпал бы с проверкой, если нет никакого параметра:
[ $# -eq 0 ] && commands...