Я пытаюсь написать сценарий 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 и должен иметь возможность читать файлы.

0
Sagar Jogadia 27 Май 2019 в 17:59

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"
0
Olli K 27 Май 2019 в 17:59

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

shift $(($OPTIND - 1))

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

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

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

0
Paused until further notice. 27 Май 2019 в 18:58
56328443