MrV*_*dji 32 bash shell-script arithmetic
我正在为 Linux 编写一个 shell 脚本,使用 Bash,将任何视频文件转换为 MP4。为此,我将avconvwithlibvorbis用于音频。
在我的脚本中,我有一个问题要问用户:
read -p "- Audio Quality [scale from -2 to 10] ? "
if [ -n "$REPLY" ] ; then
ABITRATE="-aq $REPLY"
fi
Run Code Online (Sandbox Code Playgroud)
我的“ABITRATE”字符串进入最终的avconv命令行。
但我想让用户有机会用 Kb(千位)值来回答这个问题,并将其转换为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
Run Code Online (Sandbox Code Playgroud)
我想知道如何检查我的 $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
Run Code Online (Sandbox Code Playgroud)
这可能吗(我愿意说“当然,不应该很难”,但我不知道要使用的语法)?
ori*_*ion 36
该[命令/ shell内建有对比测试,所以你可以这样做
if [ "$REPLY" -ge 1 ] && [ "$REPLY" -le 32 ]; then REPLY=-2;
elif [ "$REPLY" -ge 33 ] && [ "$REPLY" -le 48 ]; then REPLY=-1; fi
Run Code Online (Sandbox Code Playgroud)
其中-ge表示大于或等于(等等)。该[命令只是一个命令,而不是特殊语法(它实际上与test: check out相同man test),因此它需要后面的空格。如果您编写[$REPLY它,它将尝试找到一个名为的命令[$REPLY并执行它,但这是行不通的。关闭也是如此]。
在这里,我们&&仅在第一个命令成功时才使用shell 操作符运行第二个命令。[也支持-ato和两个测试,但它已被弃用,不应使用它,因为它会导致无法可靠地解析参数。
编辑:要测试数字是否为整数(如果这可能发生在您的代码中),请先进行测试
if [[ "$REPLY" =~ ^[0-9]+$ ]]; then
existing code
else echo "$REPLY is not an integer" >&2 && exit 1; fi
Run Code Online (Sandbox Code Playgroud)
当然,所有这些括号表达式都返回 0(真)或 1(假)并且可以组合。你不仅可以把所有东西都放在同一个支架里,你还可以
if [[ "$REPLY" =~ ^[0-9]+$ ]] && [ "$REPLY" -ge 1 ] && [ "$REPLY" -le 32 ]; then ...
Run Code Online (Sandbox Code Playgroud)
或类似的东西。
dev*_*ull 15
你可以简单地说:
((REPLY>=1 && REPLY<=32)) && REPLY=-2
((REPLY>=33 && REPLY<=48)) && REPLY=-1
Run Code Online (Sandbox Code Playgroud)
引用手册:
((...))Run Code Online (Sandbox Code Playgroud)(( expression ))算术表达式根据以下描述的规则进行计算(请参阅Shell 算术)。如果表达式的值非零,则返回状态为 0;否则返回状态为 1。这完全等同于
Run Code Online (Sandbox Code Playgroud)let "expression"
你可以这样做:
#!/usr/bin/env bash
read -p "- Audio Quality [scale from -2 to 10] ? "
if [ -n "$REPLY" ] ; then
ABITRATE="-aq $REPLY"
fi
echo "You chose : $ABITRATE : $REPLY"
## If 0 < $REPLY < 33 and $REPLY is a number
if [[ "$REPLY" =~ ^[0-9]+$ && "$REPLY" -gt 0 && "$REPLY" -lt 33 ]]
then
echo "GOOD"
else
echo "BAD"
fi
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
81040 次 |
| 最近记录: |