Answers:
您不能使用使用单个选项传递两个参数getopts
。
我建议以下替代方法:
在这种情况下,getopts会将它们视为一个参数,但是稍后您将能够对其进行拆分。您甚至可以一次将所有参数放入数组中:
#!/bin/bash
while getopts ":hr:l:" opt; do
case $opt in
r ) echo "Run Numbers - argument = $OPTARG "
set -f # disable glob
IFS=' ' # split on space characters
array=($OPTARG) ;; # use the split+glob operator
l ) echo "Latency range - argument = $OPTARG" ;;
h ) helptext
graceful_exit ;;
* ) usage
clean_up
exit 1
esac
done
echo "Number of arguments: ${#array[@]}"
echo -n "Arguments are:"
for i in "${array[@]}"; do
echo -n " ${i},"
done
printf "\b \n"
运行示例:
./script -r "123 456 789"
并输出:
Run Numbers - argument = 123 456 789
Number of arguments: 3
Arguments are: 123, 456, 789
./script -r 123,456,789
而您只需将上面的代码替换IFS=" "
为IFS=,
。那一个优点是允许空元素。正如评论部分所指出的,此解决方案是由一些常见程序(例如)选择的lsblk -o NAME,FSTYPE,SIZE
。
-r
选项Multiple -r
,但每个仅接受一个参数:
./script -r 123 -r 456 -r 789
然后参数将被一一添加到数组中
array+=("$OPTARG")
这样做的好处是对元素可以包含的字符没有限制。某些标准linux工具(例如)也使用了此工具awk -v var1=x -v var2=y
。
array=(${OPTARG//,/ })
。还有一种可能是-r arg
每次将元素添加到数组时都只使用多次选项array+=($OPTARG)
。
IFS=',' array=($OPTARG)
pgrep
使用逗号:ps -s 123,456 ...
,grep的用途重复选项:grep -e pattern1 -e pattern2 ...
(-e
当仅使用一个图案是可选的)。
,
似乎是合理的,甚至优于使用空间。
mount
。