Разбор комбинации аргументов командной строки и флагов в bash - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь написать скрипт 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 ]

0 голосов
/ 27 мая 2019

После цикла while вам необходимо shift исключить любые параметры и их аргументы.Это работает, даже если нет флагов / аргументов флагов.

shift $(($OPTIND - 1))

Тогда остальные аргументы доступны в "$@" и могут обрабатываться любым из обычных способов.Например:

for arg in "$@"
do
    something_with "$arg"
done

Для получения дополнительной информации см. Мой ответ здесь .

0 голосов
/ 27 мая 2019

Используя цикл 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"
...