Đặt dấu ngoặc kép xung quanh nhiều đối số
Trong trường hợp này, getopts sẽ coi chúng là một đối số, nhưng bạn sẽ có thể phân tách nó sau này. Bạn thậm chí có thể đặt tất cả các đối số trong mảng cùng một lúc:
#!/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"
Ví dụ về chạy:
./script -r "123 456 789"
Và đầu ra:
Run Numbers - argument = 123 456 789
Number of arguments: 3
Arguments are: 123, 456, 789
Sử dụng dấu phẩy (hoặc ký tự ưa thích khác) làm dấu phân cách
./script -r 123,456,789
và bạn chỉ cần thay thế IFS=" "
bằng IFS=,
trong mã ở trên. Điều đó có lợi thế cho phép các yếu tố trống. Như đã chỉ ra trong phần bình luận, giải pháp này được lựa chọn bởi một số chương trình phổ biến, vd lsblk -o NAME,FSTYPE,SIZE
.
Cho phép nhiều -r
tùy chọn
Nhiều -r
, nhưng mỗi chỉ lấy một đối số:
./script -r 123 -r 456 -r 789
Sau đó, các đối số sẽ được thêm vào từng mảng một
array+=("$OPTARG")
Điều đó có một ưu điểm là không có giới hạn về các ký tự mà các yếu tố có thể chứa. Công cụ này cũng được sử dụng bởi một số công cụ linux tiêu chuẩn, vd awk -v var1=x -v var2=y
.
mount
.