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

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

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 для создания каталога, если он не существует
  • никогда не используйте оператор `-a` или` -o` с `[`
  • Логика Bash назад в одной системе, но не другая
  • Оператор if и else с использованием diff -q
  • В чем смысл & amp в отношении тестовой команды?
  • Тест POSIX и -a
  • Команда тестирования в unix не выводит результат
  • работает как команда, но не как сценарий оболочки. Зачем?
  • 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

    Как я могу потянуть переменную env в отображение ключей VIM?

    Лучший способ работы / отображения дерева изображений, отсортированных по размеру

    Установка определенной версии ядра на debian linux

    Ошибка при установке привода с fstab

    Как я могу перенаправить «все» на https://www.example.com?

    Именованный канал изменяет файловую систему?

    В чем разница между / dev / sda и / dev / hda?

    NFS для клиентов с разными uid: s, чем на сервере, где клиент uid: s не будет отображаться на сервере

    установка переменной среды как функции другой переменной env

    Как остановить появление ^ T% в первой строке, когда я открываю новую lxterminal tab с ^ T в zsh?

    изменить местоположение файла .sqlite_history

    Рекурсивный grep vs find / -type f -exec grep {} \; Что более эффективно / быстрее?

    Загрузка и установка Meteor через Dockerfile

    Автоматический пакет установлен, но aptitude не находит никаких зависимостей. Что я делаю не так?

    Wind River Linux, ошибка неудачной зависимости

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