动态构建的参数如何使用 /bin/sh 正确处理空格



我必须使用/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 "
}

最新更新