Принимать много одинакового аргумента 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