LINUX.ORG.RU

Как вставить значение переменной в одинарные кавычки?

 , , ,


0

1

В bash есть особенность: внутри одинарных кавычек значение переменной не разворачивается:

networkByte="205"

result1=`echo $networkByte`
result2=`echo '$networkByte'`

echo $result1
echo $result2

Выхлоп:
205
$networkByte

В связи с этим вопрос: а как тогда подставлять значения переменных в grep/sed? Вот есть такая команда:
projectType=`cat ./config.xml | \
 grep '^\s*<\s*App\s*name.*project.*network\s*=\s*\"$networkByte\".*>\s*' | \
 sed -E 's/(^.*project\s*=\s*\")(.*)(\"\s*network\s*=\s*\"$networkByte\".*>\s*)/\2/'`

Здесь используется переменная $networkByte, но ее значение не вставляется в команду, как хотелось бы, а вместо этого всовывается строка «$networkByte».

А как сделать, чтобы в команду вставлялось значение переменной?

★★★★★

как-то так наверно:

networkByte="205"

result1=`echo $networkByte`
result2=`echo \'$networkByte\'`

echo $result1
echo $result2


projectType=`cat ./config.xml | \
 grep '^\s*<\s*App\s*name.*project.*network\s*=\s*\"'$networkByte'\".*>\s*' | \
 sed -E 's/(^.*project\s*=\s*\")(.*)(\"\s*network\s*=\s*\"'$networkByte'\".*>\s*)/\2/'`
screamager ()

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

projectType=`cat ./config.xml | \
 grep "^\s*<\s*App\s*name.*project.*network\s*=\s*\"$networkByte\".*>\s*" | \
 sed -E "s/(^.*project\s*=\s*\")(.*)(\"\s*network\s*=\s*\"$networkByte\".*>\s*)/\2/"`

Но тогда непонятно другое: если в строку " " написать \" (т.е. " \" ", то такую запись bash превратить в строку, состоящую из символа ". То есть, экранирование пропадет.

И именно такая строка будет скармливаться в grep/sed (то есть, без экранирования кавычек). И получается что grep/sed получат не то, что ожидалось (как было бы, если б их параметры были записаны в одинарных кавычках).

И вот этот момент непонятен.

Xintrea ★★★★★ ()

Экранирование хорошо для простых случаем. Для случая как у тебя, с экранированием будет ад.

Кавычки можно миксовать.

Да, и имеет смысл перестать пользоваться обратными кавычками.

networkByte="205"

result1=$(echo $networkByte)
result2=$(echo "'""$networkByte""'")

echo $result1
echo $result2
205
'205'
Kroz ★★★★★ ()
Последнее исправление: Kroz (всего исправлений: 1 )
$ echo 'This is "complex" string. $?='"$?"
This is "complex" string. $?=0
Kroz ★★★★★ ()
Ответ на: комментарий от ananas

для bash-а проще printf использовать

Как раз printf не такой наглядный как echo, особенно когда много переменных.

Kroz ★★★★★ ()
Ответ на: комментарий от Xintrea

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

$ networkByte="205"
$ echo -e 'trampampam\n205"tadantamtam\nops!' | grep '^'$networkByte'\".*' | sed -E 's/('$networkByte'\".*dan).*/\1/'
205"tadan
screamager ()
Ответ на: комментарий от screamager

можно использовать одинарные кавычки, просто из строки регэкспа вынеси переменные, то есть перед переменной закрывай кавычку, а после нее опять открывай

Да, так можно делать, сразу этого не догнал.

Xintrea ★★★★★ ()
Ответ на: комментарий от Kroz

Как раз printf не такой наглядный как echo, особенно когда много переменных.

Зато там есть «%q» и об аде экранирования больше думать не надо.

vodz ★★★★★ ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.