Как инвертировать шаблон случая

Можно настроить управление питанием с

hdparm -B $value /dev/sdx

Помещенный это, например, в /etc/init.d/boot.local

Заключение в кавычки страницы справочника:

Низкая стоимость означает агрессивное управление питанием, и высокое значение означает лучшую производительность. Возможные настройки колеблются от значений 1 - 127 (которые разрешают вращение вниз), и оценивает 128 - 254 (которые не разрешают вращение - вниз). Самая высокая степень управления питанием достигнута с установкой 1, и самая высокая производительность ввода-вывода с установкой 254. Значение 255 говорит hdparm отключать Усовершенствованное Управление питанием в целом на диске (не вся поддержка дисков, запрещающая его, но большинство делает).

4
14.01.2015, 01:40
3 ответа

Добавьте корпус по умолчанию:

case $price in
[0-9] | "." | "$") true
            ;;
*) 
   do-something
   ;;
esac
5
27.01.2020, 20:49

Для сопоставления строки, содержащей только одно, положительное целое число с помощью корпуса Case Заявление, которое вы можете сделать:

case "${string:--}" in
(*[!0-9]*)  
! echo 'Invalid value for $string!';;
(*[!0]*) 
echo "$string is a positive integer greater than 0.";;
(*)
echo "$string is 0.";;
esac

в первом Case I Экран для любого значения $ {String: -} расширение, которое содержит даже один символ, который не является одним из 0123456789 . В мероприятии $ String либо unset, либо NULL он расширится на - и поэтому все еще совпадает с этим шаблоном. Ведущий ! Инверты return return (который всегда 0) до 1 - и поэтому корпус построить возврат 1, если $ String содержит неверное значение.

В следующем соответствующем любое значение $ String , содержащее одну цифру, которая не составляет 0 - и поэтому любое количество ведущих 0s на любое допустимое значение для $ String будет соответствовать как положительное число.

Последние матчи, которые не соответствовали предыдущему двору, - это означает, что он соответствует только одному или нескольким 0s.

1
27.01.2020, 20:49

Этот ответ относится не к уже объясненной проблеме случая , а к проблеме соответствия.

Сначала нам нужно определить, как могут выглядеть валидные строки. Самое простое определение, конечно, допускает только одну структуру типа

  1. , начинающуюся с одной или нескольких цифр (допускаются ведущие нули)
  2. десятичная точка
  3. две трейлинговые цифры (если необходимо 00)
  4. Долларовый знак (без лидирующего пробела)

В качестве регулярного выражения (для e. g. grep, см. man 7 regex) это будет написано так:

^[0-9]+\.[0-9][0-9]\$$
  • ^ отмечает начало строки, т.е. перед [0-9]+
  • Точка экранируется \. для того, чтобы считаться буквальной точкой
  • Знак доллара escaped \$ для того, чтобы считаться буквальным
  • , трейлинг $ обозначает конец строки, т.е. после литерала $

Testing:

> echo '0123.45$' | grep -E '^[0-9]+\.[0-9][0-9]\$$'
0123.45$

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

^[0-9]+(\.[0-9][0-9])?\$?$

Testing:

> echo '0123$' | grep -E '^[0-9]+\.[0-9][0-9]\$$'

# no match
> echo '0123$' | grep -E '^[0-9]+(\.[0-9][0-9])?\$?$'
0123$
> echo '0123.45$' | grep -E '^[0-9]+(\.[0-9][0-9])?\$?$'
0123.45$

Оболочка может работать с регулярными выражениями напрямую, но не в рамках шаблонов case. Вам нужна структура [[]]. Но так как вы хотите знать только соответствует строка или нет, то нет причин использовать case:

if [[ "$price" =~ ^[0-9]+(\.[0-9][0-9])?\$?$ ]]; then
  :
else
  :
fi

Если вам действительно нужен case, то вы можете установить опцию extglob с помощью булитина оболочки shopt и переписать регекс в "shell regex":

shopt -s extglob

^[0-9]+(\. [0-9][0-9])?\$?$ становится тогда

+([0-9])?(.[0-9][0-9])?($)

ведущим $

, если вы хотите $0123.45 вместо 0123. 45$ тогда вы, очевидно, должны поставить чек на $ в начале:

  • grep /[[ ]]: ^\$?[0-9]+(\.[0-9][0-9])?$
  • соответствие паттерна оболочки: ?($)+([0-9])?(.[0-9][0-9])

более простая проверка

Если вас не волнует порядок, а только правильные символы, то вы можете использовать гораздо более простые выражения:

  • grep /[[ ]]: ^[0-9.$]+$
  • сравнение паттерна оболочки: +([0-9.$])

пример

#! /bin/bash

shopt -s extglob

for value in 1234 1234EUR; do
    case "$value" in
            +([0-9]))
                    echo "value OK: '${value}'"
            ;;
            *)
                    echo "value not OK: '${value}'"
            ;;
    esac
done
2
27.01.2020, 20:49

Теги

Похожие вопросы