Принимать много одинакового аргумента cli в сценарии оболочки?

В сценарии оболочки, возможно bash, как мы можем взять многие аргументы одного типа и добавить их во внутренний массив? Пример будет выглядеть так:

./combine -f file1 -f file2 -f file3 -o output_file

Я знаю, что эту простую проблему можно решить с помощью кошки и перенаправления. Но мне интересно, как, скажем, в bash мы можем взять все три аргумента -f и поместить их в массив, чтобы мы могли что-то с ними сделать?

Из-за природы требования нам нужна некоторая форма флагов, поскольку будут другие аргументы.

На языке, подобном python, это довольно просто, особенно с такими библиотеками, как docopt. Вы можете указать массив, как задумано, и все готово.

Спасибо

1 ответ

Ты можешь использовать getopts:

#!/bin/bash

while getopts "f:o:" opt; do
    case $opt in
        f) file+=("${OPTARG}") ;;
        o) output="${OPTARG}" ;;
        *) exit 1 ;;
    esac
done
shift $((OPTIND-1))

echo "List of files: \"${file[@]}\""
echo "Output: \"$output\""

так например:

$ bash test.sh -f 1 -f 2 -f three -o /dev/null
List of files: "1 2 three"
Output: "/dev/null" 

так что я делаю, это добавление каждого вхождения каждого -f пометить в массив file а затем просто распечатать его. что касается -o я просто сохраняю вход в переменную output, все остальное приведет к stderr getopts и выходу:

$ bash test.sh -w hi
test.sh: illegal option -- w
$ echo $?
1                       
Другие вопросы по тегам