как вызвать функцию с 2 аргументами, которая под опцией "getopts" - PullRequest
0 голосов
/ 19 сентября 2019

Новый в Linux bash скрипт.Здесь я попытался создать несколько файлов с getopts.Например, я хотел бы создать 3 файла с именем xyzfile, в командной строке следует указать ./createfiles -n xyzfile 3 (2 аргумента после параметра -n).Результатом должно быть 3 файла с именами xyzfile_1, xyzfile_2 и xyzfile_3.

Я попытался поместить свою функцию createfile() вне цикла while, а также внутри цикла while.Но опция -n не работает.Я также попытался создать еще одну функцию под названием foo() с включенной функцией createfile(), но все же что-то там не так.Я понятия не имею, что я могу сделать.Надеюсь, я смогу получить несколько советов от вас, ребята.Большое спасибо!

#!/bin/bash

    while getopts :n:bc opt; do
        case $opt in
            n) echo test 3333333
                 createfile() {
                    echo "$OPTARG"
                    sum=$2

                 for((i=1;i<=sum;i++))
                    do
                    touch "$OPTARG_${i}"
                done
                 }
                 createfile $OPTARG ${2};;
            b) echo "test 1111111";;
            c) echo "test 2222222";;
            *) echo error!;;
        esac
    done

Ответы [ 3 ]

1 голос
/ 19 сентября 2019

Используйте отдельную опцию для подсчета и создавайте свои файлы после обработки опции.

Что-то вроде:

while getopts "n:c:" opt; do
    case $opt in
        n) name="$OPTARG";;
        c) count=$OPTARG;;
        # other options...
    esac
done

shift $((OPTIND -1))

while (( count > 0 )); do
    touch "${name}_$count"
    (( count-- ))
    # ...
done
1 голос
/ 20 сентября 2019

getopts поддерживает только параметры без или с одним аргументом.Таким образом, вы должны решить, каким образом вы хотите, чтобы ваш скрипт работал.У вас есть несколько опций:

  • добавить новую опцию -m или аналогичную для передачи максимального количества файлов, которые вы хотите создать: createfile -n xyzfile -m 3
  • вы также можете использовать аргументыкоторые не передаются как опция, если вы хорошо разберетесь, то createfile 3 -n xyzfile или createfile -n xyzfile 3 будет означать то же самое.В моих сценариях я часто использую такой позиционный аргумент, если есть одна опция, которую пользователь всегда должен передавать.
  • Вы могли бы даже подумать об изменении способа вызова сценария на createfile xyzfile -n 3 или даже createfile xyzfile, гдеname является позиционным аргументом и необязательным числом файлов (выберите логическое значение по умолчанию, вероятно, 1) ...
1 голос
/ 19 сентября 2019

Сначала проанализируйте параметры, затем используйте обнаруженные значения.Опция может принимать только один аргумент, поэтому -n получает только первый (я оставлю это здесь в качестве имени файла).Счет будет обычным позиционным аргументом, найденным после анализа параметров.

while getopts :n:bc opt; do
  case $opt in
    n) stem=$OPTARG; shift 2;;
    b) shift 1;;
    c) shift 1;;
    *) shift 1; echo error ;;
  esac
done

count=${1?No count given}

createfile () {
  for ((i=$1; i<=$2; i++)); do
      touch "${1}_${i}"
  done
}


createfile "$stem" "$count"
...