Этот ответ относится не к уже объясненной проблеме случая
, а к проблеме соответствия.
Сначала нам нужно определить, как могут выглядеть валидные строки. Самое простое определение, конечно, допускает только одну структуру типа
00
)В качестве регулярного выражения (для e. g. grep
, см. man 7 regex
) это будет написано так:
^[0-9]+\.[0-9][0-9]\$$
^
отмечает начало строки, т.е. перед [0-9]+
\.
для того, чтобы считаться буквальной точкой \$
для того, чтобы считаться буквальным $
обозначает конец строки, т.е. после литерала $
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
У нас была эта ошибка у пары клиентов, DRDY ERR. Воспринимаемая ситуация заключалась в снижении скорости / производительности с большим количеством (очень большим числом) Raw_Read_Error_Rate.
К сожалению, эти ошибки обычно не являются доброкачественными, ожидаемая скорость при копировании файлов составляла 42–100 МБ / с и упала до менее 2 МБ / с за 60–90 секунд при копировании только 2 ГБ данных с последующим отказом. На самом деле это была проблема с контроллером SATA.
После проверки журналов мы сделали все необходимое для отказа оборудования. Была заменена материнская плата, заменены рейд-контроллеры, а также старые внебиржевые жесткие диски снова были заменены заводскими сертифицированными устройствами. Все идеально, хорошо и быстро после надлежащего ухода. Хотя дороговизна.
Dec 17 12:24:15 JoaoLuiz (ada0:ata3:0:0:0): WRITE_DMA. ACB: ca 00 00 00 00 40 00 00 00 00 00 00
Dec 17 12:24:15 JoaoLuiz (ada0:ata3:0:0:0): CAM status: ATA Status Error
Dec 17 12:24:15 JoaoLuiz (ada0:ata3:0:0:0): ATA status: 51 (DRDY SERV ERR), error: 84 (ICRC ABRT )
Dec 17 12:24:15 JoaoLuiz (ada0:ata3:0:0:0): RES: 51 84 10 00 00 00 00 00 00 f0 00
Dec 17 12:24:15 JoaoLuiz (ada0:ata3:0:0:0): Retrying command
<about 10.000 DRDY SERV ERRs were enough to command maitenance>
Салют!