如果您对$OUT
的格式不是完全死板的,那么一种可能性是重复option=
字符串以允许串联。然后您可以写成:
export OUT="a=arg1 b=arg2.0 b=arg2.1"
如果这是可以接受的,下面的脚本将起作用。
#!/bin/bash
declare -A args
for arg in $OUT; do
if [[ "$arg" =~ ^([[:alnum:]]+)=(.*)$ ]]; then
key=${BASH_REMATCH[1]}
val=${BASH_REMATCH[2]}
if [[ -z ${args[$key]} ]]; then
args[$key]=-$key="$val"
else
args[$key]+=" $val"
fi
fi
done
command() { :; }
set -x
command "${args[@]}"
set +x
我不太喜欢它,但这是我能达到的最接近的状态。
下面是一个样本运行:
$ export OUT="a=foo b=bar b=glitch s9= s9=* "
./command-runner
+ command -a=foo '-b=bar glitch' '-s9= *'
+ :
+ set +x
如果您导入一个bash函数(例如,在您的bash启动文件中),则可以更好地利用数组。以下是一种方法:
# This goes into your bash startup file:
declare -a SAVED_ARGS
save_args() {
SAVED_ARGS=("$@")
}
do_script() {
/path/to/script.sh "${SAVED_ARGS[@]}" "$@"
}
为了说明,script.sh
:
#!/bin/bash
command() { :; }
set -x
command "${@/#/-}"
set +x
例子:
$ save_args x=3 y="a few words from our sponsor"
$ do_script a=3 b="arg2.0 arg2.1"
+ command -x=3 '-y=a few words from our sponsor' -a=3 '-b=arg2.0 arg2.1'
+ :
+ set +x
$ do_script a=42
+ command -x=3 '-y=a few words from our sponsor' -a=42
+ :
+ set +x
如果不是很明显:
command() { :; }
定义了一个名为command
的bash函数,它几乎什么也不做(除了调用内置的:
,这个命令什么也不做),并且
"${@/#/-}"
在IT技术中,使用#
模式进行查找和替换时,可以将连字符插入到每个位置参数的开头。此模式实际上是一个空模式,仅匹配字符串的开头。
set ...args... ; <更多代码>; command $@
。 - technosaurus