Разделите единственную строку на символьный массив с помощью, ТОЛЬКО колотят

Я рекомендовал бы 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 главного меню:

iptraf main menu

Это - снимок экрана если iftop:

iftop

9
19.04.2015, 18:56
4 ответа
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")'
12
27.01.2020, 20:05

Метод 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 Отказ
Эффективно, вы можете использовать $ Ответить , который является изменением по умолчанию, где прочитает .

0
27.01.2020, 20:05

Чтобы разделить строку в массив символов, с нулевым разделителем, вы можете:

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[@]}"
4
27.01.2020, 20:05

Просто для забавы (и другие оболочки) другой вариант:

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
2
27.01.2020, 20:05

Теги

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