значения true и false в оболочке - PullRequest
7 голосов
/ 22 июня 2011

Я прочитал это в оболочке, Команда true возвращает 0 => логическое значение true. ложная команда return 1 => логическое ложное. Но я получаю удивительные результаты, когда бегу.

if [ 0 ]
then
echo "0 is true."
else
echo "0 is false."
fi

if [ 1 ]
then
echo "1 is true."
else
echo "1 is false."
fi

if [ false ]
then
echo "false is true."
else
echo "false is false."
fi

if [ true ]
then
echo "true is true."
else
echo "true is false."
fi

Я получаю эти результаты.

0 верно. 1 верно. ложь это правда. правда это правда.

Ответы [ 3 ]

10 голосов
/ 22 июня 2011

Тест if [ 0 ] проверяет, является ли 0 пустой строкой (это не так), и возвращает true, если она не пустая. Тест if [ 1 ] аналогичным образом проверяет, является ли 1 пустой строкой, и возвращает true, если она не пустая. Аналогично, два других теста проверяют, являются ли строки true и false пустыми ...

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

if false; then echo False is true; else echo False is false; fi
if true ; then echo True  is true; else echo True  is false; fi

Большинство машин не имеют команд, называемых 0 или 1, поэтому вы не можете легко вызывать их как команды.

Вы также можете поэкспериментировать с:

if sh -c "exit 1"; then echo Shell exited as true; else echo Shell exited as false; fi
if sh -c "exit 0"; then echo Shell exited as true; else echo Shell exited as false; fi

В 7-м издании Unix /bin/test (или, возможно, /usr/bin/test) была тестовой программой, но обычно вы найдете ссылку /bin/[. Когда он вызывался именем [, он требовал, чтобы его последний аргумент был ], чтобы вы могли написать условие в квадратных скобках.

Вскоре после этого операция test была встроена в оболочку вместо того, чтобы быть отдельным исполняемым файлом, но семантика осталась в основном неизменной. Поскольку теперь они различны (встроенные в исполняемый файл), иногда тестовые операции имеют различную функциональность. POSIX определяет базовую линию; различные оболочки и системы обеспечивают различные расширения.

На сегодняшний день пакет autoconf рекомендует использовать test вместо [, хотя это потому, что он использует квадратные скобки для другой цели.

5 голосов
/ 22 июня 2011

[ - это команда.Если передана строка не нулевой длины, возвращается true.Если вы хотите выполнить команды true или false, не используйте вместо этого команду [.

0 голосов
/ 26 августа 2014
#!/bin/ksh

echo "test-1 \"var is undefined\"  if [ "\$var" ] "  
if [ "$var" ] ; then 
    echo "\"$var\" is true"
else
    echo "\"$var\" is false"
fi
echo 

echo "test-2 \"var=\" (not set to a value) if [ "\$var" ] "
var=
if [ "$var" ] ; then 
    echo "\"$var\" is true"
else
    echo "\"$var\" is false"
fi

echo

echo "test-3 \"var=0\"  if [ "\$var" ] "
var=0
if [ "$var" ] ; then 
    echo "\"$var\" is true"
else
    echo "\"$var\" is false"
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...