BASH: Using awk to filter unique lines results in 0 length array

Согласно Systemd-networkd вам необходимо создать интерфейс виртуального моста с;

nano /etc/systemd/network/MyBridge.netdev

мимо следующего содержимого

[NetDev]
Name=br0
Kind=bridge

, затем перезапустить systemd-networkd.service

для проверки типа ip a

На следующем шаге создайте сетевой профиль для моста с помощью

 nano /etc/systemd/network/MyBridge.network

И добавьте следующее содержимое:

[Match]
Name=br0

[Network]
DHCP=ipv4

Изменить

Чтобы установить точку доступа, вы можете использовать create_ap github_create_ap

Установка

yaourt -S create_ap

Для других дистрибутивов

git clone https://github.com/oblique/create_ap
cd create_ap
make install

Примеры

Без парольной фразы (открытая сеть):

 create_ap wlan0 eth0 MyAccessPoint

Парольная фраза WPA + WPA2:

 create_ap wlan0 eth0 MyAccessPoint MyPassPhrase

ТД без общего доступа к Интернету:

 create_ap -n wlan0 MyAccessPoint MyPassPhrase

Совместное использование Интернета по мосту:

 create_ap -m bridge wlan0 eth0 MyAccessPoint MyPassPhrase

Мостовое совместное использование Интернета (предварительно настроенный интерфейс моста):

 create_ap -m bridge wlan0 br0 MyAccessPoint MyPassPhrase

Совместное использование Интернета с того же интерфейса Wi-Fi:

 create_ap wlan0 wlan0 MyAccessPoint MyPassPhrase

Выберите другой драйвер адаптера WiFi.

 create_ap --driver rtl871xdrv wlan0 eth0 MyAccessPoint MyPassPhrase

Без ключевой фразы (открытая сеть) с использованием канала:

 echo -e "MyAccessPoint" | create_ap wlan0 eth0

Парольная фраза WPA + WPA2 с использованием канала:

 echo -e "MyAccessPoint\nMyPassPhrase" | create_ap wlan0 eth0

Включить IEEE 802.11n

  create_ap --ieee80211n --ht_capab '[HT40+]' wlan0 eth0 MyAccessPoint MyPassPhrase

Изоляция клиента:

 create_ap --isolate-clients wlan0 eth0 MyAccessPoint MyPassPhrase

Служба Systemd

Использование постоянной службы systemd

Немедленно запустить службу:

systemctl start create_ap

Запускать при загрузке:

systemctl enable create_ap

-1 21 --- 76323-

Начиная с irssi 0.8.17 можно игнорировать ТОЛЬКО действие:

/help ignore

Специальный уровень «NO_ACT» может использоваться для игнорирования активности в строке состояния {{1} } без фактического игнорирования сообщения; это поведение несколько особенное , потому что оно разрешено в дополнение к другим игнорированиям для той же цели.

Пример:

 / IGNORE mike NO_ACT -MSGS 
 

2
13.04.2017, 15:36
2 ответа
awk '!x[$0]++' <<< "$list" | while read -r line; do
    array[count++]=$line
done

Массив array (italic) в данном случае является частью subshell (bold).

У $line и $array есть значение пока подоболочка, так сказать, жива.

Как только подпрограмма завершает свою работу, т.е. умирает, восстанавливается родительское окружение (spawner). Это включает стирание всех переменных, установленных во вложенной оболочке.

In this case:

  • $array removed,
  • $line removed.

Попробуйте так:

list=$'red apple\nyellow banana\npurple grape\norange orange\nyellow banana'
awk '!x[$0]++' <<< "$list" | while read -r line; do
    array[count++]=$line
    printf "array[%d] { %s\n" ${#array[@]} # array[num_of_elements] {
    printf "       %s\n" "${array[@]}"     # elements
    printf "}\n"                           # } end of array

done

printf "\n[ %s ]\n\n" "END OF SUBSHELL (PIPE)"

printf "array[%d] {\n" ${#array[@]}
printf "       %s\n" "${array[@]}"
printf "}\n"

Выдает:

array[1] {
       red apple
}
array[2] {
       red apple
       yellow banana
}
array[3] {
       red apple
       yellow banana
       purple grape
}
array[4] {
       red apple
       yellow banana
       purple grape
       orange orange
}

[ END OF SUBSHELL (PIPE) ]

array[0] {

}

Или как в руководстве.

Мы можем начать с Трубопроводов

[...] Каждая команда в конвейере выполняется в своей собственной подоболочке (см. Среда выполнения команд). [...]

А Command Execution Environment расширяет приключение следующим образом:

[...] Команда, вызванная в этой отдельной среде не может повлиять на среду выполнения оболочки.

Замена команд, команды, сгруппированные в круглые скобки, и асинхронные команды вызываются в окружении вложенной оболочки, которое дублирует окружение оболочки, за исключением того, что ловушки, пойманные оболочкой, сбрасываются до значений, которые оболочка унаследовала от своего родителя при вызове. Встроенные команды, которые вызываются как часть конвейера, также выполняются в среде подоболочки. Изменения, внесенные в среду подоболочки, не могут повлиять на среду выполнения оболочки. [...]

Оно не может влиять: таким образом, оно не может устанавливать.

Однако мы можем перенаправить и сделать что-то в направлении:

list=$'red apple\nyellow banana\npurple grape\norange orange\nyellow banana'

while read -r line; do
    arr[count++]=$line
done <<<"$(awk '!x[$0]++' <<< "$list")"

echo "arr length = ${#arr[@]}"
count=0
while [[  $count -lt ${#arr[@]} ]]; do
    echo ${arr[count++]}
done
3
29.04.2021, 00:13

Некоторые решения вашей проблемы без цикла

# use bash's mapfile with process substitution 
mapfile -t arr < <( awk '!x[$0]++' <<<"$list" )

# use array assignment syntax (at least bash, ksh, zsh) 
# of a command-substituted value split at newline only
# and (if the data can contain globs) globbing disabled
set -f; IFS='\n' arr=( $( awk '!x[$0]++' <<<"$list" ) ); set +f
1
29.04.2021, 00:13

Теги

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