#!/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
事实上应该如此
使用 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[@]}"