Shell-Script

如何正確擷取選項和非選項參數?

  • January 24, 2012

我想編寫一個 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一起推出您自己的解決方案。

引用自:https://unix.stackexchange.com/questions/8830