linux变量替换换行符,如何避免bash命令替换以删除换行符?

不追踪的换行符不会被删除

您正在寻找的换行符在那里,只是看不到它们,因为您在使用时echo没有引用变量。

验证:

$ a=$( df -H )

$ echo $a

Filesystem Size Used Avail Use% Mounted on /dev/sda3 276G 50G 213G 19% / udev 2.1G 4.1k 2.1G 1% /dev tmpfs 832M 820k 832M 1% /run none 5.3M 0 5.3M 0% /run/lock none 2.1G 320k 2.1G 1% /run/shm

$ echo "$a"

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda3       276G   50G  213G  19% /

udev            2.1G  4.1k  2.1G   1% /dev

tmpfs           832M  820k  832M   1% /run

none            5.3M     0  5.3M   0% /run/lock

none            2.1G  320k  2.1G   1% /run/shm

$

尾随换行符被删除

正如@ user4815162342正确指出的那样,尽管不删除输出中的换行符,但使用命令替换来删除结尾的换行符。请参见下面的实验:

$ a=$'test\n\n'

$ echo "$a"

test

$ b=$(echo "$a")

$ echo "$b"

test

$

在大多数情况下,这无关紧要,因为echo将添加删除的换行符(除非使用该-n选项调用该换行符),但是在某些极端情况下,程序输出中的尾随换行符不止一个,并且对于一些理由。

解决方法

1.添加虚拟字符

在这种情况下,如@Scrutinizer所述,您可以使用以下解决方法:

$ a=$(printf 'test\n\n'; printf x); a=${a%x}

$ echo "$a"

test

$

说明:在换行符之后,将字符x添加到输出中(使用printf x)。由于换行符不再尾随,因此不会被命令替换删除。下一步是x使用中的%运算符删除添加的${a%x}。现在我们有了原始输出,其中包含所有换行符!!!

2.使用进程替换进行读取

代替使用命令替换将程序的输出分配给变量,我们可以使用进程替换 来将程序的输出提供给read内置命令(贷记为@ormaaj)。流程替换将保留所有换行符。将输出读取到变量有点棘手,但是您可以这样做:

$ IFS= read -rd '' var <

$ echo "$var"

test

$

说明:

我们将read命令的内部字段分隔符设置为null IFS=。否则read,不会将整个输出分配给var,而只会将第一个令牌分配给。

我们read用options 调用-rd ''。的作用r是防止反斜杠充当特殊字符,并将d ''定界符设置为no,以便read读取整个输出,而不仅仅是第一行。

3.从管道读取

代替使用命令或进程替换将程序的输出分配给变量,我们可以将程序的输出通过管道传递给read命令(贷方为@ormaaj)。管道还保留所有换行符。但是请注意,这时候我们设置的lastpipe外壳可选行为,使用了shopt内置。这是必需的,以便read在当前Shell环境中执行命令。否则,变量将在子shell中分配,并且脚本的其余部分将无法访问该变量。

$ cat test.sh

#!/bin/bash

shopt -s lastpipe

printf "test\n\n" | IFS= read -rd '' var

echo "$var"

$ ./test.sh

test

$

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值