Intereting Posts
Чтение данных в двух файлах, содержащих столбцы и отображаемые данные, если они соответствуют Как получить pid процесса в фоновом режиме? Что происходит, когда пользователь, не являющийся пользователем root, отправляет сигналы в процесс пользователя root? nginx веб-сервер на виртуальной машине недоступен для хоста Изменение строк в файле только в том случае, если они соответствуют шаблонам в другом файле Высокий на% ва от верхней команды, есть ли способ ограничить это? Как исключить каталоги NFS с помощью find? Mutt новых уведомлений по электронной почте в окне tmux Утилита, полезная для работы с памятью, возвращает N первых отсортированных значений Как скопировать дату, меньшую, чем конкретная дата в файле Не удается подключиться к Wi-Fi сети после обновления kali Linux Можно ли ссылаться на глобальную переменную, даже если локальная область существует с тем же именем? iptables / https: маршрутизатор, получающий трафик INPUT, исходящий от порта 443 Не понимаю команду «n» sed Перекрестные запросы от VLAN в dnsmasq

Команда 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 $? покажет вам, каков на самом деле код, который вы могли бы затем исследовать дальше.