我想更新目前这样的脚本:
$ 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
分配第一个项目,但它无法正常工作。我不确定如何将参数应用于此格式的函数。
我不知道有任何自动方式来做你想要的,但你可以循环遍历你的参数并构造你的命令,如下所示:
#!/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
也许这样。
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