Как вы можете сохранить кавычки при выводе переменной оболочки? - PullRequest
3 голосов
/ 22 августа 2011

Следующая строка:

`eval echo echo $VAR=\\$$VAR` >> $FILE

выведет в файл с именем $FILE:

FOO=value_of_full
BAR=value_of_bar

Я хочу вывести кавычки, такие как:

FOO="value_of_full"
BAR="value_of_bar"

Я уже пытался использовать \" и "", но оба не работали, как я ожидал.

Ответы [ 6 ]

4 голосов
/ 22 августа 2011

Это ваш eval, который поглощает ваши кавычки.

Вы можете использовать косвенную переменную, ссылающуюся с bash> = 2.0, чтобы устранить необходимость в eval:

echo "${VAR}=\"${!VAR}\"" >> $FILE

К сожалению, двойные (или тройные ...) разыменования не поддерживаются, поэтому вы не можете сделать ${!!VAR} или ${!${!VAR}} - вам все равно придется прибегнуть к методу evalдля тех.Но я не думаю, что вам это нужно в этом случае.

Если вы действительно хотите использовать eval, то вам придется дважды избегать побегов, например:

eval echo "$VAR=\\\"\$$VAR\\\"" >> $FILE

Или, если вам действительно нужен дополнительный уровеньвыполнение (как в вашем примере выше), то вам нужно тройной выход из ваших побегов!

`eval echo echo $VAR=\\\\\"\\$$VAR\\\\\"` >> $FILE

Лично я предпочитаю 1-й метод: -)

0 голосов
/ 22 августа 2011

Два лучших метода (вероятно, только bash);

  1. printf "%q=%q" VAR 'some value with special characters'
  2. Магические псевдонимы (изобретено Саймоном Тэтхэмом 1 ):

.

echo-literally-helper() {
    str="`history 1 | perl -pe 's/^ *[0-9]+ +[^ ]+ //'`"
    echo "$str"
}
alias echo-literally='echo-literally-helper #'

Описание и объяснение здесь

Вы можете использовать это чудовище вот так:

echo-literally some *highly* risky 'set' of $IMPOSSIBLE unquoted; literals&

, который должным образом не выведет ничего, кроме буквального текста, без ЛЮБОГО расширения или изменения. Хитрость в том, что это

  • превращает параметры псевдонима в завершающий комментарий
  • он может канализовать историю bash, чтобы вывести комментарий без изменений в виде строкового значения

Ты должен восхищаться этим хитрым взломом. Я уверен, что вы будете достаточно мудры, чтобы не применять его в серьезных условиях:)

1 Магические псевдонимы: лазейка в раковине Борна

0 голосов
/ 22 августа 2011

В bash вы можете сделать:

declare -p FOO BAR

К сожалению, я не могу вспомнить простой, переносимый способ получить это в POSIX sh.

0 голосов
/ 22 августа 2011

Быстрая проверка по КШ - следующие работы.

Это что-то еще, что вы пытаетесь?В какой оболочке вы находитесь?

FILE=myfile
VAR1="some text"
echo "VAR1=\"${VAR1}\"" > $FILE

cat myfile

VAR1="some text"
0 голосов
/ 22 августа 2011

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

#!/bin/sh
FILE=out.txt
VAR=BAR
BAR="value of bar"
eval TMP="\$$VAR"
echo $VAR=\"$TMP\" >> $FILE

out.txt теперь будет содержать:

BAR="value of bar"

Обратите внимание, что вам нужны кавычки в строке 4, если в BAR есть пробелы, в строке 5 снова, если в BAR могут быть пробелы. В строке 6, чтобы получить кавычки вокруг значения, вам нужны \" оболочки.

0 голосов
/ 22 августа 2011

Это работает, но я не понимаю, как вы используете VAR для имени и значения переменной.

#!/bin/sh
FILE=/tmp/out.txt
VAR1_NAME=foo
VAR1_VALUE=foo_value

echo "$VAR1_NAME=\"$VAR1_VALUE\"" >> $FILE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...