2011-03-31 112 views
1

是否可以通過命令行參數shell腳本的名稱值對,像指定命令行參數,如姓名=值對shell腳本

myscript action=build module=core 

,然後在我的劇本,得到這樣的變量 $action並處理它?

我知道$ 1 ....等等可以用來獲取變量,但不會像名稱一樣對值。即使它們是,那麼使用該腳本的開發人員也必須照顧按相同順序聲明變量。我不要那個。

+1

我認爲你的答案就在這裏:。http://stackoverflow.com/questions/2642707/shell-script-argument-parsing – drysdam 2011-03-31 12:07:34

+0

是的,與bash內建'getopts'相反,'getopt'也適用於tcsh。 – lecodesportif 2011-03-31 12:11:47

+0

我猜這樣的事情只適用於bash.Sorry我沒有指定,我使用tcsh。 – Neeraj 2011-03-31 12:24:20

回答

2

在Bourne shell中,有一個很少使用的選項'-k',它自動將在命令行中指定爲name=value的任何值放入環境中。當然,伯恩/科恩/ POSIX外殼系列(包括bash)的也做了命令名前name=value項目:

name1=value1 name2=value2 command name3=value3 -x name4=value4 abc 

在正常POSIX殼行爲,該command被調用,在name1name2環境和四個論點。在Bourne(以及Korn和bash,但不是POSIX)shell下面的選項中,在環境中僅調用name1,name2,name3name4,並且只有兩個參數。 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 
0
env action=build module=core myscript 

你說你正在使用tcsh。對於基於Bourne的炮彈,你可以放棄「env」,儘管將它留在那裏是無害的。請注意,這適用於運行命令的shell,而不適用於用於實現myscript的shell。

如果您特別需要name = value對來跟隨命令名稱,則需要在myscript內部執行一些操作。

0

喬納森的回答擴展,這個工作很好地對我說:

#!/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 
6

這爲我工作:

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