我正在撰寫一個 bash shell 腳本,它可以使用這些標志-l -u和-w [argument]
我有以下(簡化)代碼:
while getopts ":ulw:" arg; do
case "$arg" in
u)
U=1
;;
l)
L=1
;;
w)
W=1
VALUE="${OPTARG}"
;;
esac
done
當我用-w42 -l它運行我的腳本時,它應該像它應該的那樣作業。如果我使用-lw42它也有效,但是當我使用時-w42l,它認為42l是引數(而不是只是42)并且它使VALUE變數 =42l并忽略該-l選項。
如何使腳本同時適用于-w42 -l,-lw42和-w42l?
編輯:澄清一下,我知道這不是它應該作業的方式,但我的大學要求我以這種方式作業
uj5u.com熱心網友回復:
關于標準合規性
你正在嘗試的東西首先不應該起作用。
POSIX 實用程式語法指南 #5 指出:
一個或多個沒有選項引數的選項,后跟最多一個帶有選項引數的選項,當分組在一個“-”分隔符后面時應該被接受。
因此,考慮的選項-引數(該選項-w在這種情況下)只允許作為最后由單一的啟動組中的一個-。
無論如何讓它發揮作用
如果無法處理符合標準的行為,則無法使用getopts,因此需要撰寫自己的邏輯。一種方法可能如下所示:
#!/usr/bin/env bash
# ^^^^- note bash, not sh; the below code uses non-POSIX extensions
while (( $# )) && [[ $1 = -* ]]; do
arg=${1#-}; shift
while [[ $arg ]]; do
case $arg in
l*) flag_l=1; arg=${arg#l};;
u*) flag_u=1; arg=${arg#u};;
w*)
flag_w=1
rest=${arg#w}
if [[ -z $rest ]]; then
arg=$1; shift; rest=$arg
fi
if [[ $rest =~ ^([[:digit:]] )(.*) ]]; then
w_value=${BASH_REMATCH[1]}
arg=${BASH_REMATCH[2]}
else
echo "ERROR: -w not followed with a number" >&2
exit 1
fi
;;
*) echo "Unrecognized flag: $arg" >&2; exit 1;;
esac
done
done
echo "After parsing:"
echo "flag_w = ${flag_w:-0}"
echo "flag_l = ${flag_l:-0}"
echo "flag_u = ${flag_u:-0}"
echo "w_value = ${w_value:-0}"
在https://ideone.com/eDrlHd 上查看在線解釋器中運行的內容
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/386444.html
