Кавычки вокруг нескольких аргументов
В этом случае 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
.
mount
.