我有一個用 bash 腳本包裝的代碼,我想知道是否給出了某個標志(-b),如果是,更新我在腳本中的一些變數(稱為“x”)。不幸的是,我需要在 bash 腳本上完成此操作,而這里的合成器讓我抓狂。我所做的一個小例子是(沒有呼叫我包裝的代碼):
#!/bin/bash
x=0
while getopts :b opt; do
case $opt in
b) x=1;;
?) echo "";;
esac
done
echo "x is ${x}"
我的問題是我想要傳遞給命令列的標志不止一個。我嘗試使用:
...,但是當我沒有按順序while getopts :b:f:c opt; do給出標志時,它似乎無法作業(當我期望它是時我得到了)。-b -f ... -c ...x is 0x is 1
--此外,當我想給出帶有前綴(--frame而不是)的標志時,這不起作用-f。
為此目的的代碼應該是什么?我嘗試了一些選項,但我無法弄清楚合成器到底應該是什么。
先感謝您。
uj5u.com熱心網友回復:
TL;博士
帶引數的選項在optstring. 所以getopts :b:c:f意味著:
- 您有一個
-b帶有引數的選項 (b:) - 您有一個
-c帶有引數的選項 (c:) - 您有一個
-f不帶引數的選項 (f) - 使用靜默錯誤報告(前導冒號)
如果您while getopts :b:f:c opt; do...在腳本中使用并鍵入:
./script.sh -c -b -f
-b被認為是 option 的引數-c,而不是選項本身。
細節
考慮到您問題的這一部分:“當我沒有在 -b -f ... -c ... order 中提供標志時,它似乎無法正常作業”,假設您希望該b選項沒有引數,以及擁有一個的f和c選項。
如果您的選項沒有引數,請不要在optstring引數后面加上冒號;否則將冒號放在選項字符之后。通過您的簡單示例,您可以嘗試:
#!/bin/bash
x=0
fopt=""
copt=""
while getopts bf:c: opt; do
case "$opt" in
b) x=1;;
f) echo "f option found"; fopt="$OPTARG";;
c) echo "c option found"; copt="$OPTARG";;
?) echo "";;
esac
done
echo "x is ${x}"
echo "fopt is ${fopt}"
echo "copt is ${copt}"
接著:
$ ./script.sh -b -c foo -f bar
c option found
f option found
x is 1
fopt is bar
copt is foo
$ ./script.sh -c foo -f bar
c option found
f option found
x is 0
fopt is bar
copt is foo
$ ./script.sh -c foo -b
c option found
x is 1
fopt is
copt is foo
但要小心:在最后一個例子中,如果你省略foo了選項的引數-c:
./script.sh -c -b
c option found
x is 0
fopt is
copt is -b
看?-b成為缺失的論點,并未被視為一種選擇。是你的問題的原因嗎?
注意:如果您還想使用長選項,請不要使用 bash
getopts內置,請使用該getopt實用程式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/413740.html
標籤:
上一篇:查找:名稱模式作為變數
下一篇:包含別名的變數未正確展開
