Как динамически созданный аргумент может правильно обрабатывать пробелы с помощью /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 работать и поддерживать в нем пробелы?


person Gabriel Petrovay    schedule 18.05.2018    source источник


Ответы (1)


Вот тут-то и пригодятся массивы 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 "
}
person KamilCuk    schedule 18.05.2018
comment
К сожалению, я не могу использовать это решение (обновил вопрос с ограничениями). Я использую /bin/sh - person Gabriel Petrovay; 18.05.2018