我是bash的新手,我遇到了一个问题,我无法在互联网上的任何地方找到解决方案。
在我尝试自己编程之前,我想看看处理这类情况的标准方法是什么。
Basicaly我想将getopts捕获到数组......
我不确定我是否足够清楚所以让我们试着看看这个PHP示例:
http://www.test.com/index.php?a=1&b=2
<?php
function getParams() {
return $_GET[];
}
?>
这就是我想要的: myscript -a 1 -b 2
到目前为止,我发现的每一次提及都意味着我需要确切地知道我想要得到的东西:
while getopts a:b: option
do
case "${option}"
in
a) a=${OPTARG};;
b) b=${OPTARG};;
esac
done
有没有一种方法可以将所有参数的关联数组传递给脚本,无论这些选项是什么,所以我总是可以这样做:
OPTS = get_params
echo $OPTS[@]
然后我可以对自己的等等做一些验证......
再次对不起,如果我错过了一些明显的东西,我真的很不喜欢bash,我真的很感激任何帮助或指导从哪里开始。
非常感谢你。
答案 0 :(得分:1)
简单地:
declare -A myopts
while getopts cqz:b:a: OPTNAM ;do
myopts[$OPTNAM]=$OPTARG
done
测试:
set -- -a 4 -b 23 -c -q -- file test
declare -A myopts
while getopts cqz:b:a: OPTNAM ;do
myopts[$OPTNAM]=$OPTARG
done
set | grep ^myopts=
myopts=([a]="3" [b]="3" [c]="" [q]="" )
echo ${@:$OPTIND}
file test
[ ${myopts[c]+.} ] && echo switch c present
switch c present
for sw in c q z;do
echo switch $sw $(
[ ${myopts[$sw]+.} ] && echo present || echo absent )
done
switch c present
switch q present
switch z absent
echo ${myopts[a]}
3
答案 1 :(得分:0)
你可以遵循这些方针:
#!/bin/bash
declare -A my_opts
while (($#)); do
case $1 in
-- )
shift
break
;;
-* )
my_opts[${1#-}]=$2
shift 2
;;
* )
break
;;
esac
done
for k in "${!my_opts[@]}"; do
echo "$k => ${my_opts[$k]}"
done
# At this point, you still have the remaining arguments in $@
echo "Arguments left: ${@:-(none)}"
# End of script #
请调用此脚本test_args
和chmod +x test_args
。然后(说明这种过于简化的方法的副作用):
$ ./test_args -a 1 -b 2
a => 1
b => 2
Arguments left: (none)
$ ./test_args -a 1 -- -b 2
a => 1
Arguments left: -b 2
$ ./test_args -a 1 foo -b 2
a => 1
Arguments left: foo -b 2
$ ./test_args --a 1 -b 2
-a => 1
b => 2
Arguments left: (none)
$ # And a bad one (with this simplified version):
$ ./test_args -a -- foo
-a => --
Arguments left: foo