2011-03-31 52 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

相关问题