LINUX.ORG.RU

как правильно if [[ $a -eq $b ]] или if [[«$a» -eq «$b» ]]

2-й вариант надёжнее. Впрочем, двойные скобки уже убирают большинство косяков bash

и можно ли использовать символы =

В принципе можно, но вообще «==» используется для сравнения строк, а для чисел "-eq" и пр.

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

2-й вариант надёжнее. Впрочем, двойные скобки уже убирают большинство косяков bash

Косяки эти у вас, а не в bash. В [[ и сравнении чисел типа -eq кавычки ничего не меняют от слова вообще.

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

В оригинале нет (добавленных полезных комментариев).

anonymous
()
Ответ на: комментарий от vodz

Косяки эти у вас, а не в bash. В [[ и сравнении чисел типа -eq кавычки ничего не меняют от слова вообще.

Ок, а теперь в переменную b попала пустая строка вместо числа. Что вернёт сравнение с одинарными скобками без кавычек?

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

в переменную b попала пустая строка вместо числа.

Это запрещенное состояние для численной переменной. Проверяйте состояние до сравнения

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

Это запрещенное состояние для численной переменной. Проверяйте состояние до сравнения

Что не оправдывает паршивый синтаксис. Необходимо брать переменные в кавычки, или использовать двойные скобки, которые убирают большинство косяков bash

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

Ответ неверный, проверяй в консоли

А это ничего, что вы пишите автору bash-стиля персеру выражений в ash?

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

Видимо, ничего :)

router@europe:~$ a=2
router@europe:~$ b=
router@europe:~$ if [ $a -eq $b ]; then echo ok; fi
bash: [: 2: unary operator expected
router@europe:~$ if [ "$a" -eq "$b" ]; then echo ok; fi
bash: [: : integer expression expected
router@europe:~$ if [[ "$a" -eq "$b" ]]; then echo ok; fi
router@europe:~$ if [[ $a -eq $b ]]; then echo ok; fi
router@europe:~$ 
router ★★★★★
()

Я давно использую несколько перегруженный вариант


function MATH {
  eval "$1=\"`echo $3 | bc -l`\""
}

$ MATH xx = '1.1 + 2.2*3.3'
$ echo $xx
8.36

$ MATH2 t = '1.1 <= 2.2'
$ echo $t
 ### 1 = true; 0 - false
1

$ MATH2 t = '1.1 > 2.2
$ echo $t
0

if [ "$t" == "0" ]; then ...

Такая практика сложилась с частого использования (t)csh и соотв. алиаса

alias MATH 'set \!:1 = `echo "\!:3-$" | bc -l`'

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

Сказал умирающий в одиночестве Ларри, когда все уже писали на питоне.

anonymous
()
Ответ на: комментарий от EXL

Да откуда ж вы такие придурки беретесь?

Какой пхытон, когда баш есть? А если баша не хватает, то можно либо на С написать, либо скрипт для октавы быстренько накалякать.

anonymous
()
Ответ на: комментарий от router

«unary operator expected» Т.е. потеря одного из аргументов это типа норм и bash идеален?

Не пишет bash такую ошибку при использовании встроенного синтаксиса [[ ]]. Читать надо внимательнее, прежде чем комменты писать, тогда и обсираться не будете.

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

Не пишет bash такую ошибку при использовании встроенного синтаксиса [[ ]].

Мой первый комментарий в теме:

Впрочем, двойные скобки уже убирают большинство косяков bash

Так что все лежащие тут какашки ваши ;)

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

Мой первый комментарий в теме:

На что и было отвечено, что это не проблема bash. Это проблема обратной совместимости с sh, когда было 64k на процесс и встраивать утилиты в shell было просто непозволительно, потому [ - это test, изначально внешняя утилита, она не может знать о внутренней кухне shell, она берет как и все утилиты строчные аргументы. [[ и придуман изначально не в bash, а в ksh, и не устраняет и не косяки, а меняет эмуляцию внешнего вызова на встроенный синтаксис языка.

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

Это проблема обратной совместимости с sh

А как быть, если необходимо использовать sh, а не bash? Какое-нибудь «устоявшееся решение» есть?

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

А как быть, если необходимо использовать sh, а не bash? Какое-нибудь «устоявшееся решение» есть?

Конечно. Так как особого смысла в сравнении не чисел нет, всё равно скрипт будет работать чёрте-как с ошибкой, то просто надо вначале сделать алгоритм, который гарантирует, что сравниваются числа, и тогда и ни [[, ни кавычки - не нужны.

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

который гарантирует, что сравниваются числа

Так я и спрашивал об этом. Ссылок на вменяемый материал есть?

PS: И не только числа. Интересует грамотная проверка не-«пустот».

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

Так я и спрашивал об этом. Ссылок на вменяемый материал есть?

Об этом — это об чём? Ни в минимальном ни в большом sh нет простого теста, что аргумент в [/[[ — число, даже на regex сделать хорошую проверку, что не будет переполнения в общем виде не возможно. Если это внешние/человеческие вводимые данные, то их надо всегда тщательно проверять. Общего рецепта — нет, так как может вам отрицательные числа тоже не подойдут, либо больше миллиона... Если это внутренние данные, то надо просто качественно писать программу.

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

Общего рецепта — нет.

Я и не жду «общего». Это было бы странно, если бы оно было, а о нём никто не знал. Интересует проверка не-«пустот» без нагромождения if [ ! -z "$a" ]

PS: По-моему даже [ ! -z "$a" ] && не прокатывает.

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

без нагромождения

Вы, натурально, не понимаете. У одного одни косяки, у другого — нагромождение... Поймите, если тут МОЖЕТ быть пусто, и вы это не хотите, значить надо проверять. Если тут пусто — это=0, то в bash это по умолчанию, а в других можно сделать такое присваивание. Если тут не может быть — то и не надо. Видите? Никакого нагромождения и нет.

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

У одного одни косяки, у другого — нагромождение

Но не в вакууме же живём. Кто-нибудь уже обходил «пустоты». Что, каждый раз один и тот же «велосипед» придумывать? Только с «разными» колёсами.

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

Их не надо обходить. Их надо интерпретировать согласно алгоритму. В каждом конкретном месте пустая переменная может означать что-то своё, и 0 и default-value и ошибку во входных данных. Потому если у вас «$may_be_empty_var» означает default-value, то можно написать ${var-default}, а иногда проверить на пусто и начать алгоритм по исправлению данных для расчёта.

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

В каждом конкретном месте пустая переменная может означать что-то своё.

Уход от темы. Не гоже.

Возврат в тему. 1) Сравнение if [ $a -eq $b ]. Как грамотно обойти «пустоты», чтобы не завалился скрипт.

Deleted
()
Ответ на: комментарий от vodz

Я вам же написал: ${a-default}, например ${a-0}

Опа. А ссылочек на описание нет? Очень интересно. Хочется подробностей.

PS: Так ${1-not} можно?

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

Хочется подробностей.

http://wiki.bash-hackers.org/syntax/pe#use_a_default_value

синтаксис "-", а не ":-" был придуман задолго bash и им поддерживается для обратной совместимости.

Так ${1-not} можно?

Можно {1-$not}, где если нет первого аргумента у программы/функции, то взять значение из переменной $not

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

Сэнкью.

Только стоп! ${PARAMETER=WORD}. Ваш вариант как я понял для array. Или ошибаюсь?

Можно {1-$not}

Тогда наверное всё-таки ${1=$not}?

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

${PARAMETER=WORD}. Ваш вариант как я понял для array. Или ошибаюсь?

${PARAMETER=WORD} экивалентен для результата, но еще и присвоит заодно. Лучше не юзать, так как в bash это не поддерживается без ':'. Массивы тут совершенно перпендикулярны.

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

Ещё раз сэнькс. Буду «переваривать».

PS: А «пустой» команды никто не знает? Которая есть, но ничего не делает.

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

А «пустой» команды никто не знает? Которая есть, но ничего не делает.

true

Если как var= ; $var то тоже ничего не произодёт пока вы не дадите аргументов $var arg, который и будет собственно командой.

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

можно короче) просто :

help :
    Пустая команда.
    Команда не выполняет никаких действий и ни на что не влияет.
    Состояние выхода:
    Всегда возвращает успех.

Deleted
()
Ответ на: комментарий от vodz

:

Это не универсально, есть shell-ы, которые умеют goto и метки.

Подробности мать вашу. Что за шелы?

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

И какова будет в них реакция на : и на true?

: метки. Любое количество, ибо в goto можно написать строчное вычисляемое выражение. true - универсальная команда с хорошим кодом возврата.

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

: метки

var0=0
a=${1-$var0}
if [ $a -eq 0 ]
then
    :
else
    ls -1 .
fi

Реакция какая будет в csh?

PS: Не обращать внимания на бессмысленность кода. Интересна реакция.

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

Реакция какая будет в csh?

Там обругается не на ':', а гораздо раньше. И вообще, вы уже злоупотребляете.

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

И вообще, вы уже злоупотребляете.

Да. Согласен. Ушёл от темы. Сорян.

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