這是一個非常簡單的命令行參數循環。命令行參數是$1
,$2
等,命令行參數的數量是$#
。在我們完成之後,shift
命令會丟棄這些參數。
#!/bin/bash
while [[ $# -gt 0 ]]; do
case "$1" in
-a) echo "option $1, argument: $2"; shift 2;;
-b) echo "option $1, argument: $2"; shift 2;;
-c) echo "option $1, argument: $2"; shift 2;;
-*) echo "unknown option: $1"; shift;;
*) echo "$1"; shift;;
esac
done
UNIX命令通常希望您自己引用多字參數,以便它們顯示爲單個參數。用法如下:
~$ script.sh -b 'my small string... other things' -a 'other string' -c 'any other string ant etc'
option -b, argument: my small string... other things
option -a, argument: other string
option -c, argument: any other string ant etc
請注意我是如何引用長參數的。
我不建議這樣做,但如果你真的想在命令行多個單詞通過,但把它們作爲單一的參數,你需要的東西多一點複雜:
#!/bin/bash
while [[ $# -gt 0 ]]; do
case "$1" in
-a) echo "option: $1"; shift;;
-b) echo "option: $1"; shift;;
-c) echo "option: $1"; shift;;
-*) echo "unknown option: $1"; shift;;
*) # Concatenate arguments until we find the next `-x' option.
OTHER=()
while [[ $# -gt 0 && ! ($1 =~ ^-) ]]; do
OTHER+=("$1")
shift
done
echo "${OTHER[@]}"
esac
done
用法示例:
~$ script.sh -b my small string... other things -a other string -c any other string ant etc
option: -b
my small string... other things
option: -a
other string
option: -c
any other string ant etc
但是,再次強調這種用法是不被推薦的。它違背了UNIX規範和約定來連接這樣的參數。
目前尚不清楚你想要什麼。你是否想要將標誌-a,-b和-c分開,並且在列表中分別擁有一組其他參數?另外,你是否正在尋找一種不使用引號或多個單詞參數的方法? – Slartibartfast 2010-06-24 02:12:39
我想要的是,每當有一個參數(-a或-b或其他)時,腳本在此之後捕獲所有字符串,並將其放入一個變量中,我還需要檢查帶有大小寫或其他模式的參數。我知道如何使這隻有一個參數,但具有多個參數?謝謝。 – fixo2020 2010-06-24 03:05:43