打印没有上一个换行符的bash变量

时间:2016-10-17 10:39:23

标签: string bash printf

我使用此bash代码复制文件内容

#!/bin/bash

readarray content < ./test
printf "%s" "${content[@]}"

问题是我得到了我想要的东西,但最后用附加换行符。我该怎样摆脱那个换行符?

1 个答案:

答案 0 :(得分:3)

问题readarray(/ mapfile)创建,它为每个数组元素(行)添加一个尾随换行符,你需要告诉它不要做所以使用-t选项。

readarray -t content < ./test

如果必须使用printf处理它,请使用参数扩展来删除数组元素中的尾随换行符:

printf '%s' "${foo[@]/$'\n'/}"

示例:

$ readarray foo <<<$'foobar\n\nspamegg'
$ printf '%s' "${foo[@]}"
foobar

spamegg
$ printf '%s' "${foo[@]/$'\n'/}"
foobarspamegg

如果只想从数组的最后一个元素中删除尾随换行符,则需要分两步完成。首先打印除最后一个之外的所有数组元素,最后打印删除尾部换行符的最后一个元素:

printf '%s' "${content[@]:0:$((${#content[@]}-1))}"; printf '%s' "${content[${#content[@]}-1]/$'\n'/}"

示例:

$ printf '%s' "${foo[@]:0:$((${#foo[@]}-1))}"; printf '%s' "${foo[${#foo[@]}-1]/$'\n'/}"
foobar

spamegg