Variables 动态构建的参数如何使用/bin/sh正确处理空白?
我必须使用Variables 动态构建的参数如何使用/bin/sh正确处理空白?,variables,sh,whitespace,quoting,Variables,Sh,Whitespace,Quoting,我必须使用/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包含空格
/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
):
问题是,当$1
包含空格并且不使用引号来使用${dynamic_arg}时,openssl会将我的参数解释为由于空格而产生的更多参数
如果我使用引号来使用动态参数
:
openssl genrsa "${static_arg}" "${dynamic_arg}" ...
openssl genrsa "${static_arg}" ${dynamic_arg} ...
然后错误是相同的,因为openssl现在将dynamic_arg
中的2个参数解释为一个(而不是2个)
如果我在dynamic_arg
初始化中使用引号(单引号或双引号):
local dynamic_arg="-passout \"pass:$1\""
并且不引用动态参数的用法:
openssl genrsa "${static_arg}" "${dynamic_arg}" ...
openssl genrsa "${static_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 "
}
不幸的是,我无法使用此解决方案(使用约束更新了问题)。我使用的是/bin/sh