Bash
檢查 $REPLY 是否在數字範圍內
我正在為 Linux 編寫一個 shell 腳本,使用 Bash 將任何影片文件轉換為 MP4。為此,我將
avconv
withlibvorbis
用於音頻。在我的腳本中,我有一個問題要問使用者:
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 運算符執行第二個命令。[
也支持-a
to和兩個測試,但它已被棄用並且不鼓勵使用它,因為它會導致參數不能可靠地解析。編輯:要測試數字是否為整數(如果您的程式碼中可能發生這種情況),請先進行測試
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 ...
或類似的東西。