Intereting Posts
Значок приложения Lowres при переключении окон (alt-tab) Крепление (8) с креплением (2) Как удалить несколько файлов с общим префиксом и суффикс? Зашифруйте мой диск, но разрешите вводить пароль с SSH Больше свободных блоков, чем зарезервированных, но все же я получаю «свободное место на устройстве», Libvirt управляемое хранилище объемное шифрование тома в «логическом» пуле хранения при использовании avahi, как хозяин может узнать, является ли это имя hostname.local или hostname-2.local Создание ярлыков / псевдонимов в Fedora find -delete не удаляет непустые каталоги Каков вход для входа в систему openSUSE по умолчанию? Почему . и .. имеют размер файла 4 kB и 12 kB, соответственно? SSH туннели заставляют новый туннель и убивают старую сессию Проблемы с обновлением apt-get Xscreen saver не блокирует пользователя Когда сценарий работает в фоновом режиме в AIX, он создает копию в каталоге / tmp во время выполнения bg, как изменить это поведение?

Команда tput не работает в операторе if

Я пытаюсь использовать команду tput в скрипте bash if, но по какой-то причине она ведет себя неожиданно. Однако при выполнении команды и проверке кода выхода только в операторе if все работает правильно, но при непосредственном запуске команды в операторе if вещи больше не работают. Вот простой скрипт для иллюстрации моей проблемы:

#!/bin/bash tput setaf 1 if [ $? ] then echo "first if works" fi if tput setaf 1 then echo "second if works" fi 

При запуске этого скрипта выводится только «первый, если работает». Не должны ли они оба работать, если операторы работают, поскольку они эквивалентны? Я что-то пропустил? Кстати, это работает на FreeBSD в случае, если это имеет значение.

Эти заявления не эквивалентны.

Первый проверяет, есть ли $? непустая строка ; так будет всегда, поэтому тело первого всегда будет работать. [ string ]

True, если строка не является пустой строкой; иначе ложно.

Второй проверяет, tput setaf 1 ли tput setaf 1 или, альтернативно, tput setaf 1 ли его статус выхода (и, следовательно, $? ) Нулю . Тело второго if будет работать только при tput команды tput . Это в целом эквивалентно

 tput setaf 1 if [ $? -eq 0 ] ... 

Результат, который вы описываете, указывает на то, что tput setaf 1 с ненулевым кодом (например, 1). « 1 » – непустая строка, но она не равна нулю. tput setaf 1 ; echo $? покажет вам, каков на самом деле код, который вы могли бы затем исследовать дальше.