为shell脚本指定名称=值对等命令行参数

Nee*_*raj 5 shell tcsh

是否可以将命令行参数作为名称值对传递给shell脚本,例如

myscript action=build module=core
Run Code Online (Sandbox Code Playgroud)

然后在我的脚本中,获取变量 $action并处理它?

我知道$ 1 ....等等可以用来获取变量,但是不会像对子那样是名称值.即使它们是,但使用该脚本的开发人员必须负责以相同的顺序声明变量.我不要那个.

JRi*_*dsz 9

这对我有用:

for ARGUMENT in "$@"
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"
Run Code Online (Sandbox Code Playgroud)

用法

bash my_scripts.sh  STEPS="ABC" REPOSITORY_NAME="stackexchange"
Run Code Online (Sandbox Code Playgroud)

控台结果:

STEPS = ABC
REPOSITORY_NAME = stackexchange
Run Code Online (Sandbox Code Playgroud)

STEPSREPOSITORY_NAME已准备好在脚本中使用.

参数的顺序并不重要.

HTH


Jon*_*ler 5

在 Bourne shell 中,有一个很少使用的选项“ -k”,它会自动将命令行上指定的任何值name=value放入环境中。当然,Bourne/Korn/POSIX shell 系列(包括 bash)也对name=value命令名之前的项目执行此操作:

name1=value1 name2=value2 command name3=value3 -x name4=value4 abc
Run Code Online (Sandbox Code Playgroud)

在正常的 POSIX-shell 行为下,使用和在环境中command调用,并使用四个参数。在 Bourne(以及 Korn 和 bash,但不是 POSIX)shell选项下,它是通过环境中的、、和以及两个参数来调用的。手册页(如 参考资料)没有提到 的等效项,但它的工作方式与 Bourne 和 Korn shell 类似。我想我从来没有认真使用过它(该选项)。name1name2-kname1name2name3name4bashman bash-k-k

无法从脚本 ( command) 中得知环境变量是专门为此命令指定的;它们只是该脚本环境中的环境变量。

这是我所知道的最接近您要求的方法。我认为 C shell 系列不存在任何等效的东西。我不知道有任何其他参数解析器可以name=value在命令行上成对设置变量。


有一些相当重要的警告(对于简单值来说相对容易,但很难处理包含 shell 元字符的值),您可以这样做:

case $1 in
(*=*) eval $1;;
esac
Run Code Online (Sandbox Code Playgroud)

这不是 C shell 系列。有效地eval执行外壳分配。

arg=name1=value1
echo $name1
eval $arg
echo $name1
Run Code Online (Sandbox Code Playgroud)