Shell-Script

使用 getopts 為一個選項提供兩個參數

  • July 17, 2017

在下面的程式碼中,當我給出選項時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選項之後傳遞兩個參數,而不是一個。是否有捷徑可尋?

您不能使用單個選項傳遞兩個參數getopts

我推薦以下替代方案:

  1. 在多個參數周圍加上引號

在這種情況下,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
  1. 使用逗號(或其他首選字元)作為分隔符

./script -r 123,456,789

你只需在上面的程式碼中IFS=" "替換為。IFS=,那個具有允許空元素的優點。正如評論部分所指出的,這個解決方案是由一些常見的程序選擇的,例如lsblk -o NAME,FSTYPE,SIZE。 3. ### 允許多個-r選項

多個-r,但每個只接受一個參數:

./script -r 123 -r 456 -r 789

然後參數將被一一添加到數組中

array+=("$OPTARG")

這樣做的好處是對元素可能包含的字元沒有限制。這個也被一些標準的 linux 工具使用,例如awk -v var1=x -v var2=y.

引用自:https://unix.stackexchange.com/questions/164259