試圖讀取我的標志和他們的引數時,
我遇到了這樣一種情況,即傳遞帶有預期引數的標志,
被另一個標志而不是預期引數閑置,
將導致第二個標志被解釋為第一個標志的引數。
WWW_ALIAS=0
while getopts ':d:a:w' flag; do
case "${flag}" in
d)
DOMAIN_NAME=${OPTARG}
;;
a)
IFS=',' read -ra DOMAIN_ALIASES <<< "${OPTARG}"
;;
w)
WWW_ALIAS=1
;;
:)
echo "[Error] Argument for option -${OPTARG} was omitted." 1>&2
exit 1
;;
\?)
echo "[Warning] Option ${OPTARG} is not supported and will be ignored." 1>&2
;;
esac
done
if [ -z "${DOMAIN_NAME}" ]; then
echo "[Error] Domain parameter (-d) must be set" 1>&2
exit 1
fi
因此,運行./script.sh -w -d將觸發此代碼示例末尾的錯誤訊息。
但是運行./script.sh -d -w將改為分配-w給DOMAIN_NAME變數,而它不應該。
有沒有辦法確保任何標志都不能用作標志的引數?
uj5u.com熱心網友回復:
支持的語法getopts是:
- a -
-a沒有價值的期權;不支持的選項出錯 - a: -
-a具有價值的選項;不支持的選項出錯 - ab - 檢查選項
-a, -b;不支持的選項出錯 - :ab - 檢查選項
-a, -b;消除不支持選項的錯誤
由于您已指定d:,引數決議器將在切換后檢查附加值-d。不指定一個,就像在此命令中一樣:./script.sh -w -d將觸發引數決議器(而不是您的代碼)的錯誤。
由于您w沒有在 (:之后指定),因此引數決議器將不會在 switch 之后檢查附加值-w。因此,您不會看到該標志的錯誤。
當您使用 運行時-d -w,決議器只看到第一個開關,即-d,并且它使用下一個標記作為引數,這是預期的結果。
有沒有辦法確保任何標志都不能用作標志的引數?
是的,實際上有幾個選項。
選項 1:在選單內,添加健全性檢查以僅允許合理的值:
...
case "${flag}" in
d)
if [[ "${OPTARG}" == -* ]]; then
echo "Bad argument!"
exit 1
fi
DOMAIN_NAME=${OPTARG}
;;
...
選項 2:使用eval set -- "$OPTS"
有些人不喜歡這個選項,因為evalis evil。但是,如果您不害怕這種攻擊媒介,它仍然是一種選擇。
此命令將對引數進行排序,并防止此類事情發生。
在此處查找示例
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/493692.html
上一篇:PyPdf不會逐行讀取pdf文本
下一篇:cksum命令無法識別-a選項
