Я пишу сценарий оболочки для Linux, используя Bash, для перевода любого видео-файла в MP4. Для этого я использую avconv
с libvorbis
аудио.
Внутри моего скрипта у меня есть вопрос для пользователя:
read -p "- Audio Quality [scale from -2 to 10] ? "
if [ -n "$REPLY" ] ; then
ABITRATE="-aq $REPLY"
fi
Моя строка "ABITRATE" входит в последнюю avconv
командную строку.
Но я хотел бы дать пользователю возможность ответить на этот вопрос значением в килобайтах и перевести его в используемую шкалу libvorbis
. «Шкала от -2 до 10» такова:
Quality Kbit/s Normalization
-----------------------------
-2 ~32 y
-1 ~48 y
0 ~64 y
1 ~80 y
2 ~96 y
3 ~112 y
4 ~128 n
5 ~160 n
6 ~192 n
7 ~224 n
8 ~256 n
9 ~320 n
10 ~500 n
Я хотел бы знать, как проверить, находится ли мой $ REPLY в диапазоне числа. Например, я хотел бы, чтобы мой скрипт делал что-то вроде этого:
if [ $REPLY is a number between 1 and 32 ] ; then
REPLY="-2"
elif [ $REPLY is a number between 33 and 48 ] ; then
REPLY="-1"
fi
Возможно ли это (я хочу сказать «да, конечно, не должно быть сложно», но я не знаю синтаксис для использования)?
bash
shell-script
arithmetic
MrVaykadji
источник
источник
Ответы:
Встроенная
[
команда / оболочка имеет сравнительные тесты, так что вы можете просто сделатьгде
-ge
означает больше или равно (и так далее).-a
Логично «и». Команда[
- это просто команда, а не специальный синтаксис (на самом деле это то же самое, что иtest
: checkoutman test
), поэтому ей нужен пробел после нее. Если вы напишите,[$REPLY
он попытается найти команду с именем[$REPLY
и выполнить ее, которая не будет работать. То же самое касается закрытия]
.Изменить: чтобы проверить, является ли число целым числом (если это может произойти в вашем коде), сначала выполните тест
Конечно, все эти выражения в скобках возвращают 0 (истина) или 1 (ложь) и могут быть объединены. Вы можете не только поместить все в одну скобку, но и сделать
или что-то подобное.
источник
>=
?[
скобки, которые работают, как показано на рисункеman test
. Это традиционные и надежные. Тогда у вас есть много встроенных в Bash. У вас[[
есть похожие, но не точно такие же, поскольку этот не раскрывает пути (там <=> означает сравнение строк, а целочисленные сравнения такие же, как в[
). Оба также имеют множество тестов на наличие файлов, разрешения и так далее. Тогда у вас есть одинарные(
и двойные((
в ответе @ devnull. Проверьтеman bash
подCompound Commands
.foo='a'; [[ "$foo" -lt 32 ]] && echo yes
Вы могли бы просто сказать:
Цитирование из руководства :
источник
((
? Я пытался использовать их в кратчайшие сроки, и, кажется, работает как,if [ ] ; then
но я не знал, что существует.if [ condition ]; then foo; fi
эквивалентна поговоркеcondition && foo
.a=08; (( a > 1 ))
будет ошибка, так как 08 считается восьмеричным. Вы также можете использовать десятичную с10#$REPLY
.cmd && cmd
не совсем такой же , какif cmd; then ...
только вы нуждаетесь вelse
части, цепочки логического&&
и||
может вызвать тонкие ошибки.Вы могли бы сделать что-то вроде этого:
источник
Сначала проверьте, является ли ввод числовым. Например, используя оператор соответствия регулярного выражения условных выражений bash :
Чтобы проверить числовые диапазоны, у вас есть две возможности:
-gt
оператор условных выражений внутри[ … ]
или[[ … ]]
(остерегайтесь , что<
и>
операторы делают сравнение строк, а не числовое значение сравнения, так что[[ 10 < 9 ]]
верно);((…))
.Таким образом:
(Вы можете использовать разные правила аппроксимации, я не знаю, являются ли те, которые я выбрал, здесь лучшими.)
источник
Чтобы правильно определить, является ли строка (десятичным) числом, нам сначала нужно определить, что такое десятичное целое число. Простое и в то же время довольно полное определение:
И эти шаги необходимы:
Только одно регулярное выражение сделает большую часть этого:
Код для обработки нескольких чисел:
Который напечатает:
Как только это число станет чистым и понятным, единственное недостающее испытание - ограничить диапазон значений. Эта простая пара строк сделает это:
источник