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