#!/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
Где на самом деле это должно быть
обновление с набором-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
Сначала Вы объявляете 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[@]}"
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[@]}"