在下面的代码中,当我给出选项时r
,getopts
需要一个参数:
while getopts ":hr::l:" opt; do
case $opt in
r ) echo "Run Numbers - argument = $OPTARG " ;;
l ) echo "Latency range - argument = $OPTARG" ;;
h ) helptext
graceful_exit ;;
* ) usage
clean_up
exit 1
esac
done
但我需要在-r
选项后传递两个参数,而不是一个。是否有捷径可寻?
答案1
您不能使用单个选项传递两个参数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
选项多个
-r
,但每个仅采用一个参数:./script -r 123 -r 456 -r 789
然后参数将被一一添加到数组中
array+=("$OPTARG")
这样做的优点是对元素可以包含的字符没有限制。一些标准 Linux 工具也使用此工具,例如
awk -v var1=x -v var2=y
.