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

Я запускаю какой-то скрипт, передающий строковый аргумент, и я хочу сделать оператор else, показанный ниже:

if [ $1 != '' ] && [ $2 != '' ]
then 
    do something.....

, но он показал Error too many argument. Почему?

41
задан 16 July 2015 в 01:42

5 ответов

Попытайтесь использовать тест-z:

if [ -z "$1" ] && [ -z "$2" ]

От человека bash:

-z string
   True if the length of string is zero.
0
ответ дан 16 July 2015 в 01:42

Следующее также работает,

if [ "$1" == "" && "$2" == ""]; then
    echo NULL
fi
0
ответ дан 16 July 2015 в 01:42

Так как это отмечено bash, я рекомендую, чтобы одно использование расширенная тестовая конструкция ([[...]]) , и забыло кавычки:

if [[ -z $1 && -z $2 ]]; then
...

, Если Вы не идете для sh / совместимость POSIX, нет никакой причины не использовать [[ ]].

0
ответ дан 16 July 2015 в 01:42
  • 1
    первичный udp dev бочка приблизительно keys/ca.crt сертификат keys/server.crt ключ keys/server.key горячекатаная keys/dh1024.pem безопасность сценария 3 подсети топологии auth-user-pass-verify/etc/openvpn/auth-accept-all.sh auth-user-pass-optional через ENV username-as-common-name сервер 10.12.0.0 255.255.0.0 нажатия " направьте 10.11.0.0 255.255.0.0" продвиньте " направьте 10.10.0.0 255.255.0.0" #client-to-client #push " направьте 10.12.0.0 255.255.0.0" ifconfig-pool-persist проверка активности ipp.txt 5 45 глаголов состояния openvpn_status.log сохранять-бочки сохранять-ключа аккомпанемента-lzo 3 дубликата-cn продвигают " explicit-exit-notify 3" – stan 25 September 2015 в 11:22

Для старой версии ответа посмотрите вторую часть этого ответа. Если Вы хотите знать о деталях, продолжать читать

Причина проблемы

В самом вопросе сообщается, что 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), этот флаг является дефектным.

См. также

3
ответ дан 16 July 2015 в 01:42

Я думаю, что заголовок сообщения не точен, поскольку намерение в сообщении состояло в том, чтобы проверить, не являются ли 1$ и 2$ пустыми. Данный пример просто пропускал двойные кавычки в 1$ и 2$ для работы. Переменные должны быть двойные заключенный в кавычки, чтобы быть расширенными при сравнении строк. Но, проверить, существуют ли 1$ и 2$, совпадает с проверкой, если 2$ существуют, поскольку это не может существовать, если 1$ не делает. 'Если' команда также не нужна в этом случае, поскольку 'тест' возвращает true и использует '& &'; как 'затем', если возврат 0/верный:

[ "$2" != '' ] && commands...

Более простой, с (ненулевым)-n:

[ -n "$2" ] && commands...

, Чтобы "проверить, являются ли 1$ и 2$ пустыми", совпал бы с проверкой, если нет никакого параметра:

[ $# -eq 0 ] && commands...
1
ответ дан 8 October 2019 в 02:07

Другие вопросы по тегам:

Похожие вопросы: