/ / Аргументи декількох опцій за допомогою getopts (bash) - Linux, bash, shell, unix, getopts

Багато варіантних аргументів за допомогою getopts (bash) - linux, bash, shell, unix, getopts

Я намагаюся обробити аргументи командного рядка, використовуючи getopts в bash. Однією з вимог є обробка довільної кількості аргументів опціону (без використання лапок).

1-й приклад (захоплює лише 1-й аргумент)

madcap:~/projects$ ./getoptz.sh -s a b c
-s was triggered
Argument: a

Другий приклад (я хочу, щоб він поводився так, але без необхідності цитувати аргумент "

madcap:~/projects$ ./getoptz.sh -s "a b c"
-s was triggered
Argument: a b c

Чи є спосіб зробити це?

Ось код у мене зараз:

#!/bin/bash
while getopts ":s:" opt; do
case $opt in
s) echo "-s was triggered" >&2
args="$OPTARG"
echo "Argument: $args"
;;
?) echo "Invalid option: -$OPTARG" >&2
;;
:) echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done

Відповіді:

12 для відповіді № 1

Я думаю, що ви хочете отримати список значень з одного варіанту. Для цього ви можете повторити опцію стільки разів, скільки потрібно, і додати її аргумент до масиву.

#!/bin/bash

while getopts "m:" opt; do
case $opt in
m) multi+=("$OPTARG");;
#...
esac
done
shift $((OPTIND -1))

echo "The first value of the array "multi" is "$multi""
echo "The whole list of values is "${multi[@]}""

echo "Or:"

for val in "${multi[@]}"; do
echo " - $val"
done

Вихід буде:

$ /tmp/t
The first value of the array "multi" is ""
The whole list of values is ""
Or:

$ /tmp/t -m "one arg with spaces"
The first value of the array "multi" is "one arg with spaces"
The whole list of values is "one arg with spaces"
Or:
- one arg with spaces

$ /tmp/t -m one -m "second argument" -m three
The first value of the array "multi" is "one"
The whole list of values is "one second argument three"
Or:
- one
- second argument
- three

3 для відповіді № 2

Ви можете самостійно розбирати аргументи командного рядка, але getopts команда не може бути налаштована на розпізнавання декількох аргументів для одного параметра. рекомендація fedorqui є хорошою альтернативою.

Ось один із способів самостійно проаналізувати варіант:

while [[ "$*" ]]; do
if [[ $1 = "-s" ]]; then
# -s takes three arguments
args="$2 $3 $4"
echo "-s got $args"
shift 4
fi
done