Você pode puxar os nomes de um título com, digamos, awk e lançá-los em um array variável , em seguida, repita a matriz com for
. O script aqui pega o padrão da linha de comando.
#!/bin/bash
patt=$1
if [ -z "$patt" ] ; then echo "need an argument" ; exit 1 ; fi
A=( $(awk '/^\[/ {p = 0};
/^\['"$patt"'\]/ {p=1; next}
p && !/^ *$/ ;' < servers ) )
for x in "${A[@]}" ; do
echo doing something with "$x"
done
Então,
$ bash for_all.sh alternate_server_list
doing something with Jupiter
doing something with Saturn
No programa awk
:
/^\[/ {p = 0}
- defina p para zero se um colchete aberto for o primeiro caractere na linha,% /^\['"$patt"'\]/ {p=1; next}
- se correspondermos ao padrão, defina p para um e pule para a próxima linha. Note que o padrão é dado ao awk a partir da variável shell, então será tomado como uma expressão regular. As citações são um pouco engraçadas, porque há parte do código entre aspas simples, depois a variável entre aspas duplas e, em seguida, mais código entre aspas simples. como 'foo' "$var" 'bar'
, mas sem os espaços.
p && !/^ *$/
- se p estiver definido e a linha não estiver vazia (apenas espaços entre o início e o fim), imprima-a (ação padrão).
Ah, e isso irá falhar se os itens da sua lista contiverem algo engraçado, como espaços.