检查 $REPLY 是否在一个数字范围内

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)

或类似的东西。

  • @MrVaykadji 我强烈建议您还测试变量是否为数字,否则您可能会得到意想不到的结果:`foo='a'; [[ "$foo" -lt 32 ]] && echo yes` (2认同)

dev*_*ull 15

你可以简单地说:

((REPLY>=1 && REPLY<=32)) && REPLY=-2
((REPLY>=33 && REPLY<=48)) && REPLY=-1
Run Code Online (Sandbox Code Playgroud)

引用手册

((...))

(( expression ))
Run Code Online (Sandbox Code Playgroud)

算术表达式根据以下描述的规则进行计算(请参阅Shell 算术)。如果表达式的值非零,则返回状态为 0;否则返回状态为 1。这完全等同于

let "expression"
Run Code Online (Sandbox Code Playgroud)


ter*_*don 6

你可以这样做:

#!/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)