Eu quero criar uma matriz no Bash que contenha todas as interfaces de rede ativas.
Consegui criar um loop for imprimindo-os, mas quando tento criar o array, ele contém apenas a última lo
interface, mas não a outra. Este é o meu código:
#!/bin/bash
for iface in $(ifconfig | cut -d ' ' -f1| tr ':' '\n' | awk NF)
do
printf "$iface%s\n"
declare -a array_test=["$iface"]
done
for i in "${array_test[@]}"; do echo "$i"; done
E esta é a minha saída:
eno1
eno2
eno3
lo
[lo]
Além disso, como posso excluir a interface lo localhost da matriz?
Aqui está uma solução, atribua a lista e adicione um item a ela:
Se você deseja que a saída exiba um item por linha:
Para remover localhost da saída:
minha tentativa:
bash
irá construir uma matriz de qualquer lista delimitada por espaços em branco (espaços, tabulações, novas linhas) que você fornecer. exarray=(a b c)
. Podemos usar a substituição de comando ($()
) para gerar essa lista delimitada por espaços em branco. Por exemplo:e agora imprima o array que acabamos de criar:
Para excluir
lo
:Se você realmente deseja usar
ifconfig
em vez deip
, tente isto:ifconfig
gera apenas as interfaces que estão ativas.No Linux, você pode obter uma lista de interfaces no
/sys/class/net
diretório. Então, comzsh
, você pode fazer:Para excluir
lo
:Para apenas
up
aqueles, você poderia fazer:ou, assumindo o valor padrão de
$IFS
.No meu sistema, pelo menos, o status de
lo
é DESCONHECIDO, portanto, seria excluído.Isso também funcionaria com
bash
nomes de interface fornecidos que não contêm caracteres curinga. Nas versões recentes do Linux, IIRC, é garantido que os nomes de interface não contenham tabulação de espaço e caracteres de nova linha (o padrão$IFS
), portanto, eles não causariam problemas. Outros espaços em branco Unicode são permitidos, portanto, LC_ALL=C, que deve garantir queawk
não será dividido neles.Se você tiver suporte '-j' para
ip
(saída json), use o excelentejq
utilitário;(exemplo de um nó kubernetes)