gpt4 book ai didi

bash - 如何避免 bash 命令替换以删除换行符?

转载 作者:行者123 更新时间:2023-11-29 08:39:47 25 4
gpt4 key购买 nike

为了加快某些 bash 脚本的执行速度,我想使用命令替换将命令的结果保存在变量中,但是命令替换用空格替换了 0x0A 换行符。例如:

a=`df -H`

a=$( df -H )

当我想进一步处理 $a 时,换行符被空格替换,现在所有行都在一行上,这更难 grep:

echo $a

避免换行符被命令替换删除的简单技巧是什么?

最佳答案

不删除非尾随换行符

你要找的换行符在那里,你只是看不到它们,因为你使用了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。使用进程替换读取

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

$ IFS= read -rd '' var < <( printf 'test\n\n' ) 
$ echo "$var"
test


$

解释:

  • 我们设置了 internal field separator对于 null 的读取命令,使用 IFS= .否则read不会将整个输出分配给 var , 但只有第一个标记。
  • 我们调用 read 带有选项 -rd '' . r用于防止反斜杠充当特殊字符,并使用 d ''将定界符设置为空,以便 read 读取整个输出,而不仅仅是第一行。

3。从管道读取

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

$ cat test.sh 
#!/bin/bash
shopt -s lastpipe
printf "test\n\n" | IFS= read -rd '' var
echo "$var"
$ ./test.sh
test


$

关于bash - 如何避免 bash 命令替换以删除换行符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15184358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com