В корне ошибочна попытка передать список аргументов, хранящийся в переменной, в команду.
Предположительно, если у вас есть код для создания переменной, содержащей предполагаемые аргументы. для команды, затем вы можете изменить ее, чтобы вместо этого сохранить аргументы в переменной массива:
decho_argv=(a b 'c d') # <-- easy!
Затем вместо изменения команды "decho" для размещения аргументов, взятых из простой переменной (что нарушит ее способность обрабатывать обычные аргументы), вы можете сделать:
decho "${decho_argv[@]}" # USE DOUBLE QUOTES!!!
Однако, если вы находитесь в ситуации, когда вы пытаетесь получить произвольный ввод, который, как ожидается, будет строковым полем, соответствующим предполагаемым позиционным аргументам команды, и вы хотите передать эти аргументы команде, то вместо переменная, считывает данные в массив.
Обратите внимание, что предложения, которые предлагают использовать eval для установки позиционных параметров с содержимым обычной переменной, чрезвычайно опасны.
Потому что, подвергая содержимое переменной удалению кавычек и расщеплению слов в командной строке, нельзя защитить от мета-символов оболочки в строке переменной, что может привести к хаосу.
Например, представьте в следующем примере, если слово "человек" было заменено двумя словами "rm" и "-rf", а последнее слово arg было "*":
Не делайте этого:
> args='arg1 ; man arg4'
> eval set -- $args
No manual entry for arg4
> eval set -- "$args" # This is no better
No manual entry for arg4
> eval "set -- $args" # Still hopeless
No manual entry for arg4
> eval "set -- '$args'" # making it safe also makes it not work at all!
> echo "$1"
arg1 ; man arg4