在 bash 中,当使用 将输出捕获到变量中时$(...)
,会附加一个烦人的换行符。但是,我的输出有时以换行符结尾,有时则不是。我希望按原样捕获输出。
在我真正的问题中,字符串可能包含多行,但最后一行可能会或可能不会以换行符关闭,并且应该保留此属性。
在Stack Exchange 的这个答案的风格中,我的最小工作示例如下所示:
#!/bin/bash
newlinetest() {
if [ "$1" = 'with' ]; then
printf '%s\n' 'Text with newline'
else
printf '%s' 'Text without newline'
fi
}
s="$(newlinetest with ; printf '%s' 'x')"
s="${s%?}"
printf '%s%s%s\n' '(' "${s}" ')'
s="$(newlinetest without ; printf '%s' 'x')"
s="${s%?}"
printf '%s%s%s\n' '(' "${s}" ')'
它做了它应该做的,但恕我直言,这看起来像一个丑陋的黑客。有没有其他优雅的方法来解决这个问题?也许涉及mapfile
或read
?没有外部工具的解决方案将非常受欢迎。
实际上,命令替换会删除尾随的换行符,而不是附加它们。但是如果您
echo
稍后使用打印变量,它会默认添加一个。添加尾随
x
或类似的东西确实有点hackish,但这可能是最简单的方法,并且适用于所有shell。echo x
您可以通过使用而不是使其更短一些printf '%s' 'x'
。既然你提到
read
了,你也可以使用这样的东西(在 Bash 中):我会让你决定这是否比这更漂亮:
尽管两者之间存在潜在的性能差异。在第一个中,进程替换创建了一个管道,它一次
read
读取一个字节以避免超出分隔符(这与这里无关,但外壳不知道。)命令替换将读取更大的块,因此在大输出的情况下可能会更快。