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

问题描述 投票:0回答:2

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

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

bash flags getopts
2个回答
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
投票

也许这样。

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
© www.soinside.com 2019 - 2024. All rights reserved.