过程替换删除换行符并用空格替换?

过程替换删除换行符并用空格替换?
#!/bin/bash

declare -a org
while IFS=$'\n' read -r line
do

    org[0]+=$line+"\n"
done < <(iptables -L INPUT -v -n )

echo "${org[@]}"

我得到的输出是

Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target     prot opt in     out     source               destination         47668 9923K RH-Firewall-1-INPUT  all  --  *      *       0.0.0.0/0            0.0.0.0/0

事实上应该如此

iptables 输出

使用 set -x 进行更新

+ echo -e 'Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target     prot opt in     out     source               destination         48315 9974K RH-Firewall-1-INPUT  all  --  *      *       0.0.0.0/0            0.0.0.0/0           '
Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target     prot opt in     out     source               destination         48315 9974K RH-Firewall-1-INPUT  all  --  *      *       0.0.0.0/0            0.0.0.0/0

答案1

首先,您将 org 声明为一个数组,但在循环中仅使用第一个元素,同时尝试[@]在循环结束时输出所有元素 ()。bash 中的第二个“\n”是由 2 个字符“\”和“n”组成的字符串。它没有特殊含义。正如 @Thomas 所述,echo -e 将解释\n为换行符。

要添加到数组,请参见问题SO 1951506

您的明显目标是简单地读取并回显输入中的所有行。使用 cat。或者更好的是,只是iptables -L INPUT -v -n命令的纯输出。它将输出您想要的内容。

@Thomas 的答案产生了正确的输出。但是,如果您喜欢比简单地运行已经产生正确输出的命令更复杂的事情,那么您也可以这样做:

declare -a org
while IFS=$'\n' read line
do
    org+=( "$line" )
done < <( iptables -L INPUT -v -n )
printf '%s\n'  "${org[@]}"

或者这样,如果您想在每个数组元素中嵌入 \n。

declare -a org
nl=$'\n'
while IFS=$nl read line
do
    org+=( "$line$nl" )
done < <( iptables -L INPUT -v -n )
echo  "${org[@]}"

答案2

echo默认情况下不解释反斜杠转义,\n因此不将其识别为换行符。您可以使用 启用解释echo -e

#!/bin/bash

declare -a org
while IFS=$'\n' read -r line
do

    org[0]+=$line+"\n"
done < <(iptables -L INPUT -v -n )

echo -e "${org[@]}"

相关内容