是否可以通过命令行参数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