Shell-Script
如何正確擷取選項和非選項參數?
我想編寫一個 shell 腳本,它將接受一些帶有一些選項的參數並列印這些參數。假設該腳本的名稱是
abc.ksh
. 該腳本的用法是 -
./abc.ksh -[a <arg>|b <arg>|c|d] <some_string>
現在我編寫一個帶有選項和參數的 shell 腳本
#!/bin/ksh # Default Values vara="," varb=false varbname="" varc=false # Scanning inputs while getopts :a:b:cd option do case $option in a) vara=$OPTARG;; #shift $((OPTIND-1));; b) varb=true varbname=$OPTARG;; #shift $((OPTIND-1));; c) varc=true;; #shift $((OPTIND-1));; d) echo "Usage $0 \-[a|b|c|d] <filename>" exit 0;; \?) echo "Invalid option -$OPTARG. Please run '$0 -h' for help" exit 1;; :) echo "Option -$OPTARG requires an argument. Please run '$0 -d' for help" exit 1;; esac done print "Args: $* \nvara: $vara \noptfile: $varb \nvarbname: $varbname \nvarc: $varc"
正確輸入範例:
./abc.ksh -a "sample text" "some_string"
./abc.ksh "some_string" -a "sample text"
./abc.ksh -asample\ text some_string
- 等等…
some_string
輸入在我的腳本中沒有被擷取。我怎麼能抓住它?
程序通常會強制“some_string”部分作為最後一個參數,因此這
.abc.ksh "some_string" -a "sample text"
是一個錯誤。如果這樣做,則在解析選項後,$OPTIND
將索引保存到最後一個參數("some_string"
部分)。如果那不可接受,那麼您可以在開頭檢查(在輸入之前
while
查看是否有非前綴參數。這將讓您"some_string"
在開頭和結尾都有。如果您需要在中間,你可以不使用getopts
或者你可以有兩組getopts
。當第一個出錯時,可能是由於沒有前綴的參數;獲取它並開始一個新getopts
的以獲取剩餘的參數。或者你可以跳過 getopts一起推出您自己的解決方案。