for ARGUMENT in "$@"
do
KEY=$(echo $ARGUMENT | cut -f1 -d=)
KEY_LENGTH=${#KEY}
VALUE="${ARGUMENT:$KEY_LENGTH+1}"
export "$KEY"="$VALUE"
done
# use here your expected variables
echo "STEPS = $STEPS"
echo "REPOSITORY_NAME = $REPOSITORY_NAME"
#!/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
5条答案
按热度按时间bfhwhh0e1#
这对我很有效:
用途
控制台结果:
STEPS和REPOSITORY_NAME已准备好在脚本中使用。
参数的顺序并不重要。
更改日志
8mmmxcuj2#
在Bourne shell中,有一个很少使用的选项'
-k
',它自动将命令行中指定为name=value
的任何值放置到环境中。当然,Bourne/Korn/POSIX shell家族(包括bash)也对命令名之前的name=value
项执行此操作:在正常的POSIX shell行为下,
command
在环境中使用name1
和name2
调用,并使用四个参数。(以及Korn和bash,但不包括POSIX)shell-k
选项,它是通过name1
、name2
、name3
、和name4
,并且只有两个参数。bash
手册页(如man bash
)没有提到-k
的等价物,但它的工作原理与Bourne和Korn shell类似。(-k
选项)严重。无法从脚本(
command
)中判断环境变量是否仅为该命令指定;它们只是脚本环境中的环境变量。这是我所知道的最接近你所要求的方法。我不认为C shell家族存在任何等效的方法。我不知道有任何其他的参数解析器可以在命令行上从
name=value
对设置变量。有一些相当重要的警告(对于简单值来说相对容易,但是对于包含shell元字符的值来说很难),您可以这样做:
这不是C shell家族,
eval
有效地完成了shell赋值。bvk5enib3#
您说您使用的是tcsh。对于基于Bourne的shell,您可以删除“env”,尽管将其留在那里是无害的。注意,这适用于您从中运行命令的shell,而不是用于实现
myscript
的shell。如果您特别希望name=value对跟在命令名后面,则需要在
myscript
中做一些工作。irlmq6kh4#
这是一个很老的问题,但仍然有效,我还没有找到饼干削减解决方案。我结合了上述答案。为我的需要,我创建了这个解决方案;即使在参数值中使用
white space
,这也是有效的。将其另存为
argparse.sh
@示例:注意,脚本的参数可以有可选前缀
--
此脚本的一些有趣用例:
以上脚本创建为要点,参考:argparse.sh
jc3wubiy5#
根据乔纳森的回答,我觉得这句话很管用: