Я рекомендовал бы iptraf или iftop, если Вам не нужно так много функциональности. От iptraf
домашняя страница:
IPTraf является основанной на консоли утилитой статистики сети для Linux. Это собирает множество чисел, таких как пакет соединения TCP и количества байта, интерфейсная статистика и индикаторы действия, разбивки TCP/трафика UDP, и пакет станции LAN и количества байта. Функции
- Транспортный монитор IP, который показывает информацию о трафике IP, передающем по Вашей сети. Включает информацию о флаге TCP, пакет и количества байта, детали ICMP, типы пакетов OSPF.
- Общий и подробный интерфейсный IP показа статистики, TCP, UDP, ICMP, неIP и другие количества пакетов IP, ошибки контрольной суммы IP, соединяет интерфейсом с действием, количествами размера пакета.
- TCP и количества показа монитора служб UDP входящих и исходящих пакетов для общего TCP и портов приложения UDP
- Модуль статистики LAN, который обнаруживает активные хосты и показывает статистику, показывающую действие данных по ним
- TCP, UDP и другие фильтры дисплейного отображения протокола, позволяя Вам просмотреть только трафик Вы интересуетесь.
- Вход
- Ethernet поддержек, FDDI, ISDN, SLIP, PPP и типы петлевого интерфейса.
- Использует встроенный интерфейс неструктурированного сокета ядра Linux, позволяя этому использоваться по широкому спектру поддерживаемых сетевых плат.
- Полный экран, управляемая с помощью меню операция.
Снимок экрана iptraf главного меню:
Это - снимок экрана если iftop:
s="hello"
declare -a a # define array a
for ((i=0; i<${#s}; i++)); do a[$i]="${s:$i:1}"; done
declare -p a # print array a in a reusable form
Выход:
declare -a a='([0]="h" [1]="e" [2]="l" [3]="l" [4]="o")'
или (обратите внимание на комментарии)
s="hello"
while read -n 1 c; do a+=($c); done <<< "$s"
declare -p a
Выход:
declare -a a='([0]="h" [1]="e" [2]="l" [3]="l" [4]="o")'
Метод 1:
Oneliner:
s="hello"
for ((i=0;i<${#s};i++)); do result[$i]="${s:i:1}"; done
echo ${result[@]}
Расширенный код:
s="hello" # Original string.
for ((i=0;i<${#s};i++)); do # For i=0; i<(length of s); i++
result[$i]="${s:i:1}" # result[i] is equal to the i th character of $s
done # End of the loop
echo ${result[@]} # Print all elements of $result.
Метод 2:
Oneliner:
s="hello"
var=($(while read -n 1; do printf "$REPLY "; done <<< "$s"))
echo "${var[@]}"
Расширенный код:
s="hello" # Original string.
while read -n 1; do # Read chraracter by character the string.
space_separated=$(printf "$space_separated $REPLY") # $space_separated is equal to it plus the current character.
done <<< "$s" # Pass the string to the loop
result=($space_separated) # Split $space_separated into an array.
echo "${result[@]}" # Print all elements of $result.
Благодаря @Cuonglm Отказ
Эффективно, вы можете использовать $ Ответить
, который является изменением по умолчанию, где прочитает
.
Чтобы разделить строку в массив символов, с нулевым разделителем, вы можете:
str='hello'
arr=()
i=0
while [ "$i" -lt "${#str}" ]; do
arr+=("${str:$i:1}")
i=$((i+1))
done
printf '%s\n' "${arr[@]}"
с разделителем, отличным от NULL, вы можете:
set -f
str='1,2,3,4,5'
IFS=',' arr=($str)
printf '%s\n' "${arr[@]}"
Просто для забавы (и другие оболочки) другой вариант:
word=hello
unset letter
while [ ${#word} -gt 0 ]
do
rest=${word#?}
letter[${#letter[*]}]=${word%$rest}
word=$rest
done
И check
for l in "${!letter[@]}"
do
echo "letter [$l] = ${letter[l]}"
done
напечатает
letter [0] = h
letter [1] = e
letter [2] = l
letter [3] = l
letter [4] = o