Замена процесса удаляет новую строку и замену пространством?

#!/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 output

обновление с набором-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
задан 31 March 2019 в 08:34

2 ответа

Сначала Вы объявляете org как массив, но используете только первый элемент в цикле при попытке произвести все элементы ([@]) когда цикл закончен. Второй "\n" в ударе является строкой, сделанной из 2 символов '\' и 'n'. Это не имеет никакого особого значения. как @Thomas указанный, отзовитесь эхом,-e интерпретирует \n как новая строка.

Для добавления к массиву, посмотрите вопрос ТАК 1951506.

Ваша очевидная цель состоит в том, чтобы просто считать и повторить все строки от входа. Используйте кошку. Или лучше, просто простой вывод Вашего 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
ответ дан 25 October 2019 в 07:33

echo не интерпретирует Escape обратных косых черт по умолчанию и \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[@]}"
1
ответ дан 25 October 2019 в 07:33

Другие вопросы по тегам:

Похожие вопросы: