首页 > 解决方案 > 动态构建的参数如何使用 /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工作并支持其中的空白?

标签: variablesshwhitespacequoting

解决方案


这就是 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 "
}

推荐阅读