expr и если в bash - PullRequest
       31

expr и если в bash

0 голосов
/ 01 сентября 2018

Что не так с этим кодом? Если я введу число 25 , оно выдаст с ошибкой вместо lol . Я что-то упустил?

read -p "Enter number : " num
if [ `expr $num > 5` ] 
then 
echo "lol" 
else 
echo "failed" 
fi

Ответы [ 4 ]

0 голосов
/ 02 сентября 2018

То же самое в короткой строке:

read -p 'Enter a number: ' num
(( num > 5 )) && echo lol || echo fail

может быть сжато:

read -p 'Enter a number: ' num;((num>5))&&echo lol||echo fail

Этот синтаксис будет работать при успешном выполнении первой команды!

read -p 'Enter a number: ' num
((num > 5)) && {
      echo lol
      /bin/wrongcommand
      :
 } || echo fail

Может выдать:

lol
bash: /bin/wrongcommand: No such file or directory

Но нет fail, поскольку : (это псевдоним для true) всегда будет успешным.

Конечно, вы можете группировать команду для fail :

read -p 'Enter a number: ' num
((num > 5)) && {
      echo lol
      /bin/wrongcommand
      :
 } || {
      echo fail
      other command
 }

Может быть написано:

read -p 'Enter a number: ' num;((num>5))&&{ echo lol;/bin/wrongcommand;:;}||{ echo fail;other command;}

Вы можете группировать команды между { и ;} (позаботьтесь о пробеле после первых {!)

Enter a number: 4
fail
bash: other: command not found

Enter a number: 7
lol
bash: /bin/wrongcommand: No such file or directory
0 голосов
/ 01 сентября 2018

@ ответ babtistemm дает вам предлагаемое решение, но в случае, если вы настаиваете на использовании (немного старомодного) expr по какой-то причине:

read -p "Enter number : " num
if expr "$num" '>' 5 >/dev/null
    then 
        echo "lol" 
    else 
        echo "failed" 
fi

Примечания:

  1. Вам нужно заключить в кавычки >, чтобы оболочка не интерпретировала его как перенаправление stdout. Вы также можете использовать \>.

  2. Хорошей практикой также является добавление двойных кавычек к $num, так что expr будет интерпретировать его как одно выражение, таким образом ограничивая вероятность очень плохой ошибки или злоумышленник, взломавший вашу программу. (Лучше всего сделать проверку работоспособности $num перед ее использованием, например, проверить, является ли она целым числом.)

  3. Это решение требует вызова нового процесса, expr, который требует от ОС гораздо больше ресурсов, чем использование только команды оболочки test.

  4. Если вы пропустите >/dev/null, вы также получите напечатанное 0 или 1 (что означает false или true), stdout из expr. Но независимо от этого, expr устанавливает свой статус выхода, $? в соответствии с результатом выражения, которое затем проверяется if. (Дополнительное замечание: если вы попытаетесь набрать echo $? после вызова expr, сначала может возникнуть неожиданность, что $? = 0 означает истину / успех как статус выхода, а $? != 0 означает ложь по соглашению.)

0 голосов
/ 01 сентября 2018

Вы можете использовать арифметическое выражение в bash:

if (( num > 5 )); then ...

В руководстве см. https://www.gnu.org/software/bash/manual/bash.html#Conditional-Constructs

0 голосов
/ 01 сентября 2018

код

if [ `expr $num > 5` ] 

на самом деле не хочет, чтобы вы думали. Он запустит expr $num > 5, поэтому оцените параметр и перенаправьте out в файл с именем 5 («поместите 25 в файл с именем 5»), а if оценит код возврата предыдущего выражения.

Если код, предназначенный для проверки, оценивает, если число больше 5, заменить

if [ `expr $num > 5` ] 

с

[ "$num" -gt 5 ]

-gt обозначает greater than

...