我有这个多行字符串(包括引号):abc'asdf"$(dont-execute-this)foo"bar"''如何在Bash中使用Heredoc将其分配给变量?我需要保留换行符。我不想转义字符串中的字符,这很烦人...
3 回答
缥缈止盈
TA贡献2041条经验 获得超4个赞
使用$()将的输出分配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开头。
请注意,此行末尾定界符END_HEREDOC必须在行上单独存在(因此,圆括号末尾位于下一行)。
隔江千里
TA贡献1906条经验 获得超10个赞
这是Dennis方法的变体,在脚本中看起来更优雅。
函数定义:
define(){ IFS='\n' read -r -d '' ${1} || true; }
用法:
define VAR <<'EOF'
abc'asdf"
$(dont-execute-this)
foo"bar"''
EOF
echo "$VAR"
请享用
ps 为不支持的shell 制作了“读取循环”版本read -d。应与工作set -eu和未成反引号,但没有测试非常好:
define(){ o=; while IFS="\n" read -r a; do o="$o$a"'
'; done; eval "$1=\$o"; }
- 3 回答
- 0 关注
- 598 浏览
添加回答
举报
0/150
提交
取消