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

是否可以将命令行参数作为名称值对传递给shell脚本,例如
myscript action=build module=core
然后在我的脚本中,获取变量
$action
并处理它? 我知道$ 1 ....等等可以用来获取变量,但是不会像对子那样是名称值。即使它们是,但使用该脚本的开发人员必须负责以相同的顺序声明变量。我不要那个。     
已邀请:
在Bourne shell中,有一个很少使用的选项'
-k
',它会自动将命令行中指定为
name=value
的任何值放入环境中。当然,Bourne / Korn / POSIX shell系列(包括bash)也会在命令名称之前为
name=value
项执行此操作:
name1=value1 name2=value2 command name3=value3 -x name4=value4 abc
在正常的POSIX-shell行为下,在环境中使用
name1
name2
调用
command
,并使用四个参数。在Bourne(和Korn和bash,但不是POSIX)shell
-k
选项下,在环境中使用
name1
name2
name3
name4
调用它,只有两个参数。
bash
手册页(如
man bash
)没有提到相当于
-k
但它的作用就像Bourne和Korn的贝壳一样。 我认为我没有认真使用它(
-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
    
这对我有用:
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"
用法
bash my_scripts.sh  STEPS="ABC" REPOSITORY_NAME="stackexchange"
控台结果:
STEPS = ABC
REPOSITORY_NAME = stackexchange
STEPS和REPOSITORY_NAME已准备好在脚本中使用。 参数的顺序并不重要。 HTH     
env action=build module=core myscript
你说你在使用tcsh。对于基于Bourne的shell,你可以删除“env”,尽管将它留在那里是无害的。请注意,这适用于运行命令的shell,而不适用于用于实现
myscript
的shell。 如果你特别希望name = value对遵循命令名,你需要在
myscript
中做一些工作。     
根据Jonathan的回答,这对我很有用:
#!/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
    

要回复问题请先登录注册