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

Следующая команда работает для меня из командной строки (cmd) в Windows 7 на WAMP .

d:/wamp/bin/mysql/mysql5.6.17/bin/mysql.exe -u root -p db_name < database.sql

343
задан Smi 30 May 2017 в 23:10
поделиться

4 ответа

Вы можете избежать бесполезного использования cat и лучше обрабатывать несоответствующие кавычки следующим образом:

$ read -r -d '' VAR <<'EOF'
abc'asdf"
$(dont-execute-this)
foo"bar"''
EOF

Если вы не заключаете переменную в кавычки, когда вы повторяете ее, символы новой строки потерянный. Цитирование сохраняет их:

$ echo "$VAR"
abc'asdf"
$(dont-execute-this)
foo"bar"''

Если вы хотите использовать отступы для удобства чтения в исходном коде, используйте тире после минус. Отступы должны выполняться только с использованием табуляции (без пробелов).

$ read -r -d '' VAR <<-'EOF'
    abc'asdf"
    $(dont-execute-this)
    foo"bar"''
    EOF
$ echo "$VAR"
abc'asdf"
$(dont-execute-this)
foo"bar"''

Если вместо этого вы хотите сохранить табуляции в содержимом результирующей переменной, вам необходимо удалить табуляцию из IFS . Маркер терминала для этого документа ( EOF ) не должен иметь отступ.

$ IFS='' read -r -d '' VAR <<'EOF'
    abc'asdf"
    $(dont-execute-this)
    foo"bar"''
EOF
$ echo "$VAR"
    abc'asdf"
    $(dont-execute-this)
    foo"bar"''

Вкладки можно вставить в командную строку, нажав Ctrl - V Tab . Если вы используете редактор, в зависимости от того, какой,

478
ответ дан 23 November 2019 в 00:33
поделиться
VAR=<<END
abc
END

не работает, потому что вы перенаправляете stdin на то, что его не волнует, а именно назначение

export A=`cat <<END
sdfsdf
sdfsdf
sdfsfds
END
` ; echo $A

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

export A=$(cat <<END
sdfsdf
sdfsdf
sdfsfds
END
) ; echo $A
30
ответ дан 23 November 2019 в 00:33
поделиться

Используйте $ () для назначения вывода cat в вашу переменную следующим образом:

VAR=$(cat <<'END_HEREDOC'
abc'asdf"
$(dont-execute-this)
foo"bar"''
END_HEREDOC
)

# this will echo variable with new lines intact
echo "$VAR"
# this will echo variable without new lines (changed to space character)
echo $VAR

Убедитесь, что начало END_HEREDOC разделено одинарными кавычками.

Обратите внимание, что конечный разделитель heredoc END_HEREDOC должен находиться в строке только (следовательно, окончание скобка на следующей строке).

Благодарю @ephemient за ответ.

216
ответ дан 23 November 2019 в 00:33
поделиться
$TEST="ok"
read MYTEXT <<EOT
this bash trick
should preserve
newlines $TEST
long live perl
EOT
echo -e $MYTEXT
-10
ответ дан 23 November 2019 в 00:33
поделиться
Другие вопросы по тегам:

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