variables - 动态构建的参数如何使用 /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 现在将我的 2 个参数解释dynamic_arg
为一个(而不是 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 "
}