Bash

檢查 $REPLY 是否在數字範圍內

  • February 10, 2020

我正在為 Linux 編寫一個 shell 腳本,使用 Bash 將任何影片文件轉換為 MP4。為此,我將avconvwithlibvorbis用於音頻。

在我的腳本中,我有一個問題要問使用者:

read -p "- Audio Quality [scale from -2 to 10] ? "
   if [ -n "$REPLY" ] ; then
   ABITRATE="-aq $REPLY"
   fi

我的“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

我想知道如何檢查我的 $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

這可能嗎(我願意說’是的,當然,不應該很難’,但我不知道要使用的語法)?

command/shell 內置有比較測試,所以你可以這樣[

if [ "$REPLY" -ge 1 ] && [ "$REPLY" -le 32 ]; then REPLY=-2;
elif [ "$REPLY" -ge 33 ] && [ "$REPLY" -le 48 ]; then REPLY=-1; fi

where-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

當然,所有這些括號表達式都返回 0(真)或 1(假)並且可以組合。您不僅可以將所有內容放在同一個括號中,還可以

if [[ "$REPLY" =~ ^[0-9]+$ ]] && [ "$REPLY" -ge 1 ] && [ "$REPLY" -le 32 ]; then ...

或類似的東西。

引用自:https://unix.stackexchange.com/questions/118856