LINUX.ORG.RU
ФорумAdmin

истина и ложь про bash

 


1

2
#!/bin/bash

echo

echo "Проверяется \"[ 5 > 4 ]\""
if [ 5 > 4 ]
then
  echo "5 > 4 -- это истина."
else
  echo "5 > 4 -- это ложь."
fi            

echo

echo "Проверяется \"[ 5 < 4 ]\""
if [ 5 < 4 ]
then
  echo "5 < 4 -- это истина."
else
  echo "5 < 4 -- это ложь."
fi            

echo

echo "Проверяется \"[[ 5 > 4 ]]\""
if [[ 5 > 4 ]]
then
  echo "5 > 4 -- это истина."
else
  echo "5 > 4 -- это ложь."
fi            

echo

echo "Проверяется \"[[ 5 < 4 ]]\""
if [[ 5 < 4 ]]
then
  echo "5 < 4 -- это истина."
else
  echo "5 < 4 -- это ложь."
fi            

echo

echo "Проверяется \"(( 5 > 4 ))\""

(( 5 > 4 )) && echo "5 > 4 -- это истина."
(( 5 > 4 )) || echo "5 > 4 -- это ложь."

echo "Проверяется \"(( 5 < 4 ))\""

(( 5 < 4 )) && echo "5 < 4 -- это истина."
(( 5 < 4 )) || echo "5 < 4 -- это ложь."

echo

exit 0

Проверяется «[ 5 > 4 ]» 5 > 4 — это истина.

Проверяется «[ 5 < 4 ]» 5 < 4 — это истина.

Проверяется «[[ 5 > 4 ]]» 5 > 4 — это истина.

Проверяется «[[ 5 < 4 ]]» 5 < 4 — это ложь.

Проверяется "(( 5 > 4 ))" 5 > 4 — это истина.

Проверяется "(( 5 < 4 ))" 5 < 4 — это ложь.

Внимание, вопрос:

Почему [ 5 < 4 ] — это истина, а [[ 5 < 4 ]] — это ложь?

★★★

man [

При первом варианте вызывается /bin/[, который обычно используют только при проверке на равенство/неравенство с помощью ключей -a и -o (другие операции тоже ключами), лучше пользоваться двойными квадратными скобками, там синтаксис привычнее.

Bfgeshka ★★★★★
()
Последнее исправление: Bfgeshka (всего исправлений: 1)
Ответ на: потому, что man bash от mix_mix

arg1 OP arg2
OP is one of -eq, -ne, -lt, -le, -gt, or -ge. These arithmetic binary operators return true if arg1 is
equal to, not equal to, less than, less than or equal to, greater than, or greater than or equal to
arg2, respectively. Arg1 and arg2 may be positive or negative integers.

Больше ничего не нашёл

man bash | grep -e "-lt"

OP is one of -eq, -ne, -lt, -le, -gt, or -ge. These arithmetic binary operators return true if arg1 is

И чё? Ты сам-то man bash читал? :)

Windows ★★★
() автор топика
Последнее исправление: Windows (всего исправлений: 2)
Ответ на: комментарий от Windows

И какое из слов здесь тебе непонятно?

arg1 OP arg2

Есть такая конструкция внутри квадратных скобок.

Arg1 and arg2 may be positive or negative integers.

Агрументы суть целые числа.

OP is one of -eq, -ne, -lt, -le, -gt, or -ge.

Равно, не равно, меньше, «меньше или равно», больше и «больше или равно» соответсвенно.

$ [ 5 -lt 4 ] && echo yes || echo no
no
$ [ 5 -gt 4 ] && echo yes || echo no
yes
Вопросы?

mix_mix ★★★★★
()
Последнее исправление: mix_mix (всего исправлений: 1)
Ответ на: комментарий от Windows

Потому, что < не экранирован.

[ 5 < 4 ] && echo yes || echo no
bash: 4: No such file or directory
no
$ touch 4
$ [ 5 < 4 ] && echo yes || echo no
yes
$ [ 5 \< 4 ] && echo yes || echo no
no
string1 < string2
True if string1 sorts before string2 lexicographically in the current locale.

mix_mix ★★★★★
()
Ответ на: комментарий от Windows

Потому, что '<' и '>' - это символы перенаправления вывода. Т.е. часть команды '5 < 4' означает, что в файл или переменную 5 вы хотите вывести число 4.

kostik87 ★★★★★
()
Ответ на: комментарий от kostik87

Наоборот только поток данных: читаем из файла 4.

mix_mix ★★★★★
()
Ответ на: комментарий от Windows

Это ты неправильный, дурачок. Иди доки читай. http://wiki.bash-hackers.org/commands/classictest

String tests
<STRING1> < <STRING2>

True if <STRING1> sorts before <STRING2> lexicographically (pure ASCII, not current locale!). Remember to escape! Use \<

mix_mix ★★★★★
()
Последнее исправление: mix_mix (всего исправлений: 1)
Ответ на: комментарий от Windows

попадает под кейс

string
-n string
       True if the length of string is non-zero.
mix_mix ★★★★★
()
Ответ на: комментарий от Windows

Ну-ну, так нафейхоа ты спрашиваешь? Вообще, что бы не было неоднозначных ситуаций нужно почитать про утилиту, которую используешь и применять соответствующие параметры, гарантирующие однозначность трактовок.

Использовать символ перенаправления вывода кроме как для перенаправления вывод вообще неразумно.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)
Ответ на: комментарий от kostik87

Ну-ну, так нафейхоа ты спрашиваешь?

Потому что сам не до конца осознаю. Надеялся - кто-то может просветить.

man test - самый правильный ответ до этого момента, но я и сам знаю, что man test...

Вопрос ПОЧЕМУ остаётся актуальным и по ныне.

Windows ★★★
() автор топика
Ответ на: комментарий от Windows

Используй ' -lt ' и ' -gt ' и проблем у тебя не будет. Удачи.

kostik87 ★★★★★
()
Ответ на: комментарий от Windows

Потому что

[ 5 < 4 ] && echo yes || echo no
эквивалентно
cat 4 | [ 5 ] && echo yes || echo no
что эквивалетно
[ 5 ] && echo yes || echo no
что эквивалентно
[ -n 5 ] && echo yes || echo no
что даёт yes, так как читай маны, блин

mix_mix ★★★★★
()
Ответ на: комментарий от DeadEye

Потому, что POSIX и вообще нужно учитывать, что бывают шеллы кроме bash.

x3al ★★★★★
()
Ответ на: комментарий от sin_a

Как выше отметили: «<» и «>» это символы перенаправления.

Почему тогда в двойных квадратных скобках это символ сравнения?

Windows ★★★
() автор топика
Ответ на: комментарий от Windows

Потому, что [ имитирует запуск /bin/[ со всеми вытекающими, а [[ уже полноценный башизм.

mix_mix ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.