Сохранение кавычек в параметрах функции удара

То, что я хотел бы сделать, является взятием как вход к функции, строка, которая может включать кавычки (единственный или двойной) и эхо, что строка точно, поскольку это было предоставлено функции. Например:

function doit {
   printf "%s " ${@} 
   eval "${@}"
   printf " # [%3d]\n" ${?}
}

Который, учитывая следующий вход

doit VAR=42
doit echo 'single quote $VAR'
doit echo "double quote $VAR"

Приводит к следующему:

VAR=42  # [  0]
echo single quote $VAR  # [  0]
echo double quote 42  # [  0]

Так семантика переменного расширения сохраняются, как я ожидал бы, но я не могу получить точный формат строки, поскольку это было предоставлено функции. То, что я хотел бы, должно иметь doit echo 'single quote $VAR' результат в echo 'single quote $VAR'.

Я уверен, что это имеет отношение к удару, обрабатывающему аргументы, прежде чем они будут переданы функции; я просто ищу путь вокруг того (если возможный).

Править

Таким образом, то, что я предназначил, было к тени выполнением сценария при обеспечении точной копии выполнения, которое могло использоваться в качестве инструмента диагностики включая статус выхода каждого шага.

В то время как я мог описать желаемое поведение выше путем выполнения чего-то как

while read line ; do 
   doit ${line}
done < ${INPUT}

Тот подход перестал работать перед лицом управляющих структур (т.е. if, while, и т.д.). Я думал об использовании set -x но это имеет, это - ограничения также: " становится ' и статус выхода не видим для команд тот сбой.

23
задан ezpz 16 July 2010 в 13:33
поделиться

3 ответа

Причина этого в том, что bash интерпретирует аргументы, как вы думали. При вызове функции кавычек просто больше нет, так что это невозможно. Это работало в DOS, потому что программы могли интерпретировать командную строку сами, а не то, что она вам помогает!

7
ответ дан 29 November 2019 в 02:39
поделиться

Bash удалит кавычки, если вы передадите строку с кавычкой в ​​качестве аргумента командной строки. Цитаты просто больше не существует, когда строка передается вашему скрипту. У вас нет возможности узнать, есть ли одинарные или двойные кавычки.

Вы, вероятно, можете сделать что-то вроде этого:

doit VAR=42
doit echo \'single quote $VAR\'
doit echo \"double quote $VAR\"

В вашем скрипте вы получите

echo 'single quote $VAR'
echo "double quote $VAR"

Или сделайте это

doit VAR=42
doit echo 'single quote $VAR'
doit echo '"double quote $VAR"'

В вашем скрипте вы получите

echo single quote $VAR
echo "double quote $VAR"
2
ответ дан 29 November 2019 в 02:39
поделиться

Оболочка будет интерпретировать кавычки и $ , прежде чем передать их вашей функции. Ваша функция мало что может сделать, чтобы вернуть специальные символы, потому что у нее нет возможности узнать (в примере с двойными кавычками), было ли 42 жестко закодировано или получено из переменной. Вам придется избегать специальных символов, если вы хотите, чтобы они выжили достаточно долго, чтобы выполнить вашу функцию.

0
ответ дан 29 November 2019 в 02:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: