Ситуация в оболочке - проблема - PullRequest
0 голосов
/ 29 ноября 2009

Я совершенно новичок в shell и пытаюсь включить случай, когда аргумент функции arg # 1 больше или равен 12, тогда он должен возвращать 1. Но нижеприведенное не работает.

case $1 in
     -ge 12)        NUM=1   ;;
     *)         NUM=0   ;;
esac
echo $NUM

Ответы [ 5 ]

3 голосов
/ 29 ноября 2009

Оператор case не интерпретирует такие операторы, как -ge. Со страницы руководства bash:

   case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac
          A case command first expands word, and tries to match it 
          against each pattern in  turn,  using the same matching rules as 
          for pathname expansion (see Pathname Expansion below).

Вы должны использовать условное выражение в операторе if.

3 голосов
/ 29 ноября 2009

Нужно ли вам использовать case по какой-то причине? Если нет, то if кажется более естественным:

if [[ $1 -ge 12 ]]; then
  NUM=1
else
  NUM=0
fi

echo $NUM

При case bash выполняет арифметическое расширение для word и pattern , поэтому вы можете написать

case 1 in
  $(( $1 >= 12 )) )  NUM=1 ;;
  $(( $1 >=  7 )) )  NUM=2 ;;
  *)                 NUM=0 ;;
esac

Красота в глазах смотрящего.

0 голосов
/ 29 ноября 2009

Вы хотите использовать программу /usr/bin/test:

if test "$1" -ge 12; then NUM=1; else NUM=2; fi
0 голосов
/ 29 ноября 2009
case "$1" in
     [0-9]|1[01])NUM=0   ;;
     *) NUM=1   ;;
echo $NUM
0 голосов
/ 29 ноября 2009

Кейс должен принимать шаблонное выражение, например строка.

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

if [[ $1 -ge 12 ]]; then
  NUM=1
else
  NUM=0
fi

Или выразить ветки в выражениях шаблона:

case "$1" in
     [0-9])             NUM=1   ;;
     1[0-2])            NUM=1   ;;
     *)                 NUM=0   ;;
echo $NUM
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...