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

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

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) ?

  • "Test -n && echo not empty" печатает "not empty". Это ожидаемое поведение?
  • Есть ли какая-либо существенная разница при сравнении переменной как строки или как int
  • Что означает -o означает «если»?
  • Логика Bash назад в одной системе, но не другая
  • Какой смысл использовать «x $ START_DAEMON» = «xyes» здесь? (заголовок х)
  • Проверьте, если номер из диапазона <0, бесконечность)
  • sh AND и OR в одной команде
  • Использование команды test для создания каталога, если он не существует
  • 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 ]] – нет.

    Interesting Posts

    Различие в размерах от NFTS до HFS +

    Копирование большого дерева с одной машины на другую, сохранение права собственности

    Настройка зашифрованных папок с помощью ecryptfs на Raspbian

    Yum добавляет каталог «Пакет» в baseurl

    Установите powernap на debian?

    Как обновить sudo от 1.8.19p1-1 до 1.8.19p1-2 на debian Stretch, чтобы избежать ошибки «Потенциальная перезапись произвольных файлов»?

    Объединение учетных записей на двух серверах IMAP

    Как вы отслеживаете, почему плагин Vim не работает?

    Определить сеанс tmux, к которому относится сеанс оболочки?

    sed удалить строки httpd.conf

    Почему SIGSTOP не работает внутри сеанса экрана?

    Есть ли элегантный способ установить переменную оболочки в содержимое файла?

    Встроенное устройство: как выполнять сырые чтения и запись на флэш (emmc / movinand) в обход кеша файловой системы

    Как я могу проверить, запущена ли программа из сценария

    Как передать аргумент, хранящийся в переменной, в WGET

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