您需要修复替换表达式:
test_string="${test_string/\n/\\n}"
首先,你需要
//
为了替换变量中出现的所有模式:
test_string="${test_string//\n/\\n}"
(请参阅
Parameter Expansion
有关此语法的更多详细信息,请参阅手册页的。)
其次,普通bash字符串对
\n
;这只是意味着
n
,这就是您看到所显示输出的原因。您需要使用
$'...'
表达式,如下所示:
test_string="${test_string//$'\n'/\\n}"
(请参阅
QUOTING
手册页的部分。)
随着这些变化:
#!/bin/bash
hello() {
local test_string="$(cat <<'END'
line1
line2
line3
END
)"
test_string="${test_string//$'\n'/\\n}"
printf "%s" "$test_string"
}
hello
您的脚本生成:
line1\n line2\nline3
与您的问题无关,但不是使用
cat
和处理替换来设置变量,您可以这样做:
#!/bin/bash
hello() {
local test_string
read -r -d '' test_string <<'END'
line1
line2
line3
END
test_string="${test_string//$'\n'/\\n}"
printf "%s\n" "$test_string"
}
hello