Я пытаюсь написать сценарий bash, который будет читать несколько имен файлов и целевой каталог, который является необязательным.
./myfile -t /home/users/ file1 file2
Я пробовал следующий код, но я не в состоянии обрабатывать различные сценарии, упомянутые ниже:
while getopts "t:" opt; do
case $opt in
t)
echo "-t was triggered, Parameter: $OPTARG"
;;
\?)
echo "Invalid option: -$OPTARG"
exit 1
;;
:)
echo "Option -$OPTARG requires an argument."
exit 1
;;
esac
done
Но код должен обрабатывать различные сценарии, такие как: ./myfile file1 file2 -t /home/users/
, ./myfile file1 -t /home/users/ file2 file3
, ./myfile file1 file2 file3 file4
и должен иметь возможность читать файлы.
2 ответа
Использование while
цикла для read
и shift
аргументов в этом случае может быть проще. В приведенном ниже примере аргументы циклически перебираются для поиска строки -t
, в этом случае массив аргументов смещается на один шаг, и теперь индекс nr 1 должен быть необязательным homedir. Во всех остальных случаях элемент перемещается в другой массив с именем files
.
#! /bin/bash
files=()
homedir=
while (( $# > 0 )); do
case "$1" in
-t )
shift
homedir="$1"
;;
* )
files+=("$1")
;;
esac
shift
done
echo "${files[@]}"
echo "$homedir"
После цикла while
вам необходимо shift
исключить любые параметры и их аргументы. Это работает, даже если нет никаких флагов / аргументов флага.
shift $(($OPTIND - 1))
Тогда остальные аргументы доступны в "$@"
и могут быть обработаны любым из обычных способов. Например:
for arg in "$@"
do
something_with "$arg"
done
Дополнительную информацию смотрите в моем ответе здесь.
Похожие вопросы
Новые вопросы
bash
Для вопросов о скриптах, написанных для командной оболочки Bash. Для сценариев оболочки с ошибками / синтаксическими ошибками, пожалуйста, проверьте их с помощью программы shellcheck (или на сервере веб-проверки оболочки по адресу https://shellcheck.net) перед размещением здесь. Вопросы об интерактивном использовании Bash, скорее всего, будут касаться темы Super User, а не переполнения стека.