是否可以通過命令行參數shell腳本的名稱值對,像指定命令行參數,如姓名=值對shell腳本
myscript action=build module=core
,然後在我的劇本,得到這樣的變量 $action
並處理它?
我知道$ 1 ....等等可以用來獲取變量,但不會像名稱一樣對值。即使它們是,那麼使用該腳本的開發人員也必須照顧按相同順序聲明變量。我不要那個。
是否可以通過命令行參數shell腳本的名稱值對,像指定命令行參數,如姓名=值對shell腳本
myscript action=build module=core
,然後在我的劇本,得到這樣的變量 $action
並處理它?
我知道$ 1 ....等等可以用來獲取變量,但不會像名稱一樣對值。即使它們是,那麼使用該腳本的開發人員也必須照顧按相同順序聲明變量。我不要那個。
在Bourne shell中,有一個很少使用的選項'-k
',它自動將在命令行中指定爲name=value
的任何值放入環境中。當然,伯恩/科恩/ POSIX外殼系列(包括bash)的也做了命令名前name=value
項目:
name1=value1 name2=value2 command name3=value3 -x name4=value4 abc
在正常POSIX殼行爲,該command
被調用,在name1
和name2
環境和四個論點。在Bourne(以及Korn和bash,但不是POSIX)shell下面的選項中,在環境中僅調用name1
,name2
,name3
和name4
,並且只有兩個參數。 bash
手冊頁(如man bash
)沒有提及-k
的等價物,但它的工作方式與Bourne和Korn shell相同。 我不認爲我曾經認真地使用它(-k
選項)。
在腳本(command
)中沒有辦法從環境變量中唯一指定該命令;它們只是該腳本環境中的環境變量。
這是我所知道的最接近您的要求。我認爲C shell家族沒有什麼等價物。我不知道任何其他參數解析器在命令行上設置name=value
對的變量。
有了一些相當大注意事項(這是比較簡單方便,能夠價值觀做,但很難處理包含shell元字符的值),你可以這樣做:
case $1 in
(*=*) eval $1;;
esac
這不是C shell系列。 eval
有效地執行shell分配。
arg=name1=value1
echo $name1
eval $arg
echo $name1
env action=build module=core myscript
你說你正在使用tcsh。對於基於Bourne的炮彈,你可以放棄「env」,儘管將它留在那裏是無害的。請注意,這適用於運行命令的shell,而不適用於用於實現myscript
的shell。
如果您特別需要name = value對來跟隨命令名稱,則需要在myscript
內部執行一些操作。
喬納森的回答擴展,這個工作很好地對我說:
#!/bin/bash
if [ "$#" -eq "0" ]; then
echo "Error! Usage: Remind me how this works again ..."
exit 1
fi
while [[ "$#" > "0" ]]
do
case $1 in
(*=*) eval $1;;
esac
shift
done
這爲我工作:
for ARGUMENT in "[email protected]"
do
KEY=$(echo $ARGUMENT | cut -f1 -d=)
VALUE=$(echo $ARGUMENT | cut -f2 -d=)
case "$KEY" in
STEPS) STEPS=${VALUE} ;;
REPOSITORY_NAME) REPOSITORY_NAME=${VALUE} ;;
*)
esac
done
echo "STEPS = $STEPS"
echo "REPOSITORY_NAME = $REPOSITORY_NAME"
使用
bash my_scripts.sh STEPS="ABC" REPOSITORY_NAME="stackexchange"
控制檯結果:
STEPS = ABC
REPOSITORY_NAME = stackexchange
步驟和REPOSITORY_NAME已準備好在腳本中使用。
不要緊,什麼樣的順序參數是按
HTH
我認爲你的答案就在這裏:。http://stackoverflow.com/questions/2642707/shell-script-argument-parsing – drysdam 2011-03-31 12:07:34
是的,與bash內建'getopts'相反,'getopt'也適用於tcsh。 – lecodesportif 2011-03-31 12:11:47
我猜這樣的事情只適用於bash.Sorry我沒有指定,我使用tcsh。 – Neeraj 2011-03-31 12:24:20