Флаги, приводящие к вызову функций и передаче аргументов

Я хотел бы обновить скрипт, который в настоящее время выглядит следующим образом:

$ example.sh a b

Вот код внутри example.sh

for var in "$@"
do
    $var
done

Где он принимает аргументы, и эти аргументы зацикливаются и выполняются (при условии, что эти аргументы существуют).

Я хотел бы обновить скрипт, чтобы эти flags были скриптами/функциями и чтобы все последующее применялось в качестве аргумента функции.

$ example.sh --a 1 2 3 --b 4 5 6

Я хотел бы перебрать все флаги и запустить эквивалент.

a 1 2 3
b 1 2 3

Я просмотрел getopts, но я не уверен, позволит ли он мне выполнять и передавать аргументы так, как я хотел бы.

Что я пробовал:

while getopts ":a:b:c:d:" opt; do
  case "$opt" in
    a) i=$OPTARG ;;
    b) j=$OPTARG ;;
    c) k=$OPTARG ;;
    d) l=$OPTARG ;;
  esac
done

echo $i
echo $j

for file in "$@"; do
  echo $file
done

Я нашел следующий скрипт, который с учетом example --a 1 2 3 --b 4 5 6 будет назначать только первый элемент, используя OPTARG, и он не работает должным образом. Я не уверен, как применять аргументы к функции в этом формате.


person ThomasReggi    schedule 22.12.2017    source источник


Ответы (2)


Я не знаю никакого автоматического способа делать то, что вы хотите, но вы можете просто перебирать свои аргументы и создавать свои команды, например:

#!/bin/bash

cmd=()
while [ $# -gt 0 ]; do                         # loop until no args left
    if [[ $1 = --* ]]; then                    # arg starts with --
        [[ ${#cmd[@]} -gt 0 ]] && "${cmd[@]}"  # execute previous command
        cmd=( "${1#--}" )                      # start new array
    else
        cmd+=( "$1" )                          # append to command
    fi
    shift                                      # remove $1, $2 goes to $1, etc.
done

[[ ${#cmd[@]} -gt 0 ]] && "${cmd[@]}"          # run last command
person Tom Fenech    schedule 22.12.2017

Возможно, таким образом.

пример кота.sh

while read line;do
  $line
done <<<$(echo $@ | sed 's/--/\n/g')

и я пробую это

./example.sh '--echo 1 2 3 --dc -e 4sili5+p'

выход

1 2 3
9
person ctac_    schedule 22.12.2017
comment
Это приведет к неправильному анализу любых аргументов, содержащих пробелы, подстановочные знаки оболочки или --. - person Gordon Davisson; 22.12.2017
comment
@GordonDavisson да, это не лучший ответ, но мы ничего не знаем о типе cmd, поэтому я, возможно, рассказываю. - person ctac_; 22.12.2017