我必须使用/bin/sh
. :(
在下面的示例中,我需要将一个可选的动态构建参数传递给命令openssl
:
#!/bin/sh
function foo() {
local dynamic_arg="-passout pass:$1"
if [ -z $1 ]; then
dynamic_arg=""
fi
echo ${dynamic_arg}
openssl genrsa "${static_arg}" ${dynamic_arg} ...
}
如果$1
包含空格(例如qw er
):
-passout pass:qw er
usage: genrsa [args] [numbits]
...
问题是,当$1
包含空格并且不使用引号来使用 ${dynamic_arg} 时,openssl 会将我的参数解释为由于空格而导致的更多参数。
如果我使用引号来使用dynamic_arg
:
openssl genrsa "${static_arg}" "${dynamic_arg}" ...
那么错误是相同的,因为 OpenSSL 现在将我在dynamic_arg
内的 2 个参数解释为 1(而不是 2
)。如果我在dynamic_arg
初始化中使用引号(简单或双引号):
local dynamic_arg="-passout "pass:$1""
并且不引用dynamic_arg
的用法:
openssl genrsa "${static_arg}" ${dynamic_arg} ...
它仍然会抱怨(显示使用情况)具有值的dynamic_arg
:
-passout "pass:qw er"
如何使此dynamic_arg
工作并支持其中的空格?
>这就是 bash>4 数组派上用场的地方。
function foo() {
local -a dynamic_arg
dynamic_arg=("-passout" "pass:$1") # pass:$1 is enclosed in "
if [ -z $1 ]; then
dynamic_arg=()
fi
echo "${dynamic_arg[@]}"
openssl genrsa "${static_arg}" "${dynamic_arg[@]}" ...
# "${arr[@]}" expands into "${arr[0]}" "${arr[1]}" ... properly enclosed in "
}