2014-09-25 2 views
-1

Я немного застрял в этом. Я delaring переменного в верхней части моего сценария, то я создаю файл как часть моего сценария:Исключение переменной bash

app="testing" 
cat <<EOF >/etc/init.d/test 
#!/bin/bash 
args="--emperor $APPCONF/test/$APP.ini" 
EOF 

Это не похоже на работу, хотя, кажется, от переменных $ приложения. Должен ли я что-то сделать с этой переменной, чтобы заставить ее отображать ее значение, «тестирование» внутри создаваемого файла?

+0

Что это связано с _escaping_ переменной? Escaping используется для предотвращения того, что что-то оценивается, а не для того, чтобы заставить его оцениваться. – Barmar

+1

Это вопрос новичков, я все еще учусь – Jimmy

+1

BTW, BashFAQ # 50 очень важен для кода, который вы пишете здесь: http://mywiki.wooledge.org/BashFAQ/050 –

ответ

5

Использовать согласованный случай. имена переменных чувствительны к регистру.

+0

Спасибо. Это единственная проблема, хотя я заметил упоминание о том, как это сделать: '' 'args =" - emperor $ APPCONF/test/\ $ APP.ini "' '' – Jimmy

+0

Только сделайте это, если вы хотите '$' чтобы быть буквально на выходе, а не указывать, что вы хотите расширить переменную. Попробуй. – dee

0

Помимо использования согласованного футляра ($app отличается от $APP), вы можете приложить имена переменных в скобках - вы можете получить проблемы, если в противном случае вы используете пробелы между вашими значениями переменных, и это считается хорошей практикой. Например:

args="--emperor ${APPCONF}/test/${APP}.ini" 

Таким образом, $APPCONF не запутаться с ${APP}CONF также. Надеюсь, это поможет!

+0

Есть случаи, когда это не помогает - что, если 'APPCONF' имеет имя каталога, которое содержит пробелы? –

+0

Я не уверен на 100%, но разве это не должно быть покрыто двойными кавычками? [* 3,1. Ссылка на два параметра (переменные) и подстановки команд *] (http://www.dwheeler.com/essays/filenames-in-shell.html) ...честно говоря, никогда не думал об этом много, так что спасибо за то, что принесли это :) –

+0

двойные кавычки обрабатывают конец назначения, но не ту сторону, где вы на самом деле пытаетесь перечислить этот список аргументов. Когда вы используете его, вам нужно заставить его разбивать строки на пространство между '--emperor' и именем файла; делая это, не разбирая на какие-либо пространства внутри расширения 'APPCONF', становится все сложнее. –

0

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

/etc/init.d/test 

, содержащий текст:

#!/bin/bash 
args="--emperor $APPCONF/test/testing.ini" 

если Ваш скрипт должен быть:

app="testing" 
cat <<EOF >/etc/init.d/test 
#!/bin/bash 
args="--emperor \$APPCONF/test/$app.ini" 
EOF 
2

Допустим, вы делали этого Правильно. Вы хотели бы хранить свои данные в массиве:

args=(--emperor "${appconf}/test/${app}.ini") 

, а затем преобразовать его в строку для встраивания:

printf -v args_str '%q ' "${args[@]}"` 

... и использовать эту строку внутри Heredoc:

#!/bin/bash 
args=($args_str) 
EOF 

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

run_something "${args[@]}" 

См. BashFAQ #50 для обоснования и информации.

Смежные вопросы