Как динамически построенный аргумент может правильно обрабатывать пробелы с помощью / bin / sh? - PullRequest
0 голосов
/ 18 мая 2018

Я обязан использовать /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 работать и поддерживать в нем пробелы?

1 Ответ

0 голосов
/ 18 мая 2018

Вот где 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 "
}
...