Как сделать так, чтобы выписка с регистром соответствовала диапазону номеров?
Я запускаю коммутатор с номерами столбцов, которые могут быть в диапазоне от 0 до 50. Теперь каждый случай поддерживает дискретный номер столбца, и я наблюдаю его сбой.
Вот код:
i=10
a=1
b=0.65
if [ "$a" != "$b" ]; then
case $i in
[1]|[2]|[5]) echo "Not OK"; ;;
[9-10]|[12]) echo "may be ok"; ;;
*) echo "no clue - $i"; ;;
esac
fi
Я ожидаю, что этот код для вывода may be ok
но не понимаю no clue - 10
.
Ответы
Ответ 1
Bash case
не работает с диапазонами чисел. []
для шаблонов оболочки.
например, этот случай [1-3]5|6)
будет работать для 15 или 25 или 35 или 6.
Ваш код должен выглядеть так:
i=10
a=1
b=0.65
if [ "$a" != "$b" ] ; then
case $i in
1|2|5) echo "Not OK"; ;;
9|10|12) echo "may be ok"; ;;
*) echo "no clue - $i"; ;;
esac;
fi
Если i
может быть real
между 9 и 10, тогда вам нужно будет использовать if
(вместо случая) с диапазонами.
Ответ 2
if
и [
решение
arg=1
if [ "$arg" -lt 5 ]; then
echo 'less than 5'
elif [ "$arg" -lt 15 ]; then
echo 'less than 15'
elif [ "$arg" -eq 17 ] || [ "$arg" -eq 19 ]; then
echo '17 or 19'
else
echo 'neither'
fi
POSIX 7
Bash следует за POSIX, как указано fooobar.com/info/152166/...
Вот цитата: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_01 раздел "Case Conditional Construct":
Случай условной конструкции должен выполнять составной список, соответствующий первому из нескольких шаблонов (см. Обозначение соответствия шаблону) [...] Несколько шаблонов с одним и тем же составным списком должны быть разделены символом '|' символ. [...]
Формат конструкции case выглядит следующим образом:
case word in
[(] pattern1 ) compound-list ;;
[[(] pattern[ | pattern] ... ) compound-list ;;] ...
[[(] pattern[ | pattern] ... ) compound-list]
esac
а затем http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13 раздел "2.13. Обозначение соответствия шаблону" говорит:
[Если открытая скобка вводит выражение скобки, как в выражении XBD RE Bracket Expression
и расширенные регулярные выражения указывают на раздел "9.3.5 RE Bracket Expression", в котором говорится:
Выражение скобки (выражение, заключенное в квадратные скобки, "[]" ) является RE, которое должно соответствовать определенному набору одиночных символов и может соответствовать определенному набору многосимвольных элементов сортировки, пустой набор выражений списка, содержащийся в выражении скобки.
Таким образом, учитываются только отдельные символы, когда вы делаете что-то вроде:
[9-10]