Выполнение динамически созданной команды с пробелами в сценарии оболочки

#shell

#оболочка

Вопрос:

Я должен написать скрипт, который генерирует и выполняет команду с переменным количеством аргументов, содержащих имена файлов. Эти имена файлов могут содержать пробелы, и все должно нормально работать с пробелами или без них.

Например, эта сгенерированная команда может выглядеть следующим образом :

 curl --data-urlencode "js_code@/tmp/some folder/data.txt" http://www.someurl.com
  

Если я использую жестко запрограммированную команду и выполняю ее, все работает нормально, с пробелами и без пробелов. Однако, если я создаю текст команды в строковой переменной и выполняю содержимое строки, кажется, что команда не учитывает кавычки, используя только первую часть файла :

Сценарий (упрощенный, просто представьте, что командная строка создается с использованием сложных правил) :

 #!/bin/sh
#prepare
command="curl --data-urlencode "param_value@/tmp/some folder/data.txt" www.someurl.com"
#execute
$command
  

Результаты :

 $ ./test.sh
Warning: Couldn't read data from file ""param_value@/tmp/some", this makes an
Warning: empty POST.
curl: (6) Couldn't resolve host 'folder'
  

Я пробовал разные вещи, меняя стиль кавычек, используя такие вещи, как exec, но я не мог заставить это работать.

Любая помощь была бы оценена

Спасибо

Примечание: я должен добавить, что все это тестирование выполняется на Cygwin. Это может быть важно в отношении синтаксиса пути.

Комментарии:

1. @spicavigo уже пробовал это, но безрезультатно :/

2. можете ли вы заменить некоторые dbl-кавычки на одинарные кавычки?, т.е. command=»curl —data-urlencode ‘param_value@/tmp/some folder/data.txt ‘ www.someurl.com » … Удачи!

3. У меня просто есть динамический путь, в котором есть пробел, есть какое-либо средство для исправления этого?

Ответ №1:

Вы должны использовать eval :

 eval "$command"
  

Комментарии:

1. Не повезло. Команда не работает, а потому, что она ищет curl в текущем каталоге, а не в каталоге bin. (говорит, что /home/Shtong /curl не существует)

Ответ №2:

Вы пробовали:

 command='curl --data-urlencode "param_value@/tmp/some folder/data.txt" www.someurl.com'
  

Комментарии:

1. Я сделал, но, извините, те же результаты!

2. @Shtong: Я забыл убрать экранирование второй кавычки. Теперь изменил ее в своем коде.

3. О, не увидел вашей ошибки, но с ошибкой или без ошибки ошибка та же 🙂