导致函数调用和传递参数的标志

时间:2017-12-22 16:20:50

标签: bash flags getopts

我想更新目前这样的脚本:

$ 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分配第一个项目,但它无法正常工作。我不确定如何以这种格式将参数应用于函数。

2 个答案:

答案 0 :(得分:1)

我不知道任何自动方式来做你想做的事情,但你可以循环你的参数并构建你的命令,如下所示:

#!/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

答案 1 :(得分:-1)

也许这样。

cat example.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