Почему у ] и ] есть другой синтаксис?

Если я хочу выполнить некоторые команды, заданные переменные не установлены, я использую:

if [[ -z "$a" || -z "$v" ]] then echo "a or b are not set" fi 

Однако тот же синтаксис не работает с -v , я должен использовать:

 if [[ -va && -vb ]] then echo "a & b are set" fi 

Какова история за этим? Я не понимаю, почему синтаксис не будет одинаковым. Я читал, что -v – несколько недавнее дополнение к bash (4.2) ?

  • Логика Bash назад в одной системе, но не другая
  • Настройка зашифрованных папок с помощью ecryptfs на Raspbian
  • Если условие с командой ssh ​​внутри
  • Проверьте, если номер из диапазона <0, бесконечность)
  • Если утверждение, дающее ответ «else» для обоих результатов cmp
  • Почему 'if ' ветвь всегда выбрана, даже если $ 1 не 1?
  • Как я могу создать скрипт bash, который запускает irb, а затем некоторый код ruby?
  • «Если переменная не содержит« не работает »
  • 2 Solutions collect form web for “Почему у ] и ] есть другой синтаксис?”

    Тестирующие операторы -v и -z просто не совпадают.

    Оператор -z сообщает, что строка пуста. Так что правда [[ -z "$a" ]] даст хорошее приближение «переменная a не задана», но не идеальна:

    • выражение будет выдавать true, если a задано пустой строкой, а не отменено;

    • приложенный сценарий завершится с ошибкой, если a не установлен и включен параметр nounset .

    С другой стороны, -va будет точно «переменная a установлена», даже в случаях краев. Должно быть ясно, что передача $a а не a -v будет неправильной, так как она расширит эту возможную -независимую переменную до того, как оператор проверки увидит ее; поэтому он должен быть частью задачи этого оператора, чтобы проверить эту переменную, на которую указывает ее имя, и указать, установлена ​​ли она.

    Есть разница в значении -z и -v :

     echo Empty: x="" # Same with x= [[ -z $x ]] && echo z [[ -vx ]] && echo v unset x echo Unset [[ -z $x ]] && echo z [[ -vx ]] && echo v 

    Используя -z , вы не можете отличить переменную, которой было присвоено пустое значение от переменной, которой не было присвоено какое-либо значение.

    Кроме того, [[ -z $x ]] по-прежнему разумно set -u , а [[ -vx ]] – нет.

    Linux и Unix - лучшая ОС в мире.