Вы можете вытащить имена из-под заголовка с помощью, скажем, awk, и поместить их в переменную array , а затем выполнить итерацию по массиву с помощью для
. Сценарий здесь берет шаблон из командной строки.
#!/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
Итак,
$ bash for_all.sh alternate_server_list
doing something with Jupiter
doing something with Saturn
В программе awk
: / ^ \ [/ {p = 0}
- установить p равным нулю, если открытая скобка является первым символом в строка, / ^ \ ['"$ patt"' \] / {p = 1; next}
- если мы соответствуем шаблону, установите p равным единице и переходите к следующей строке. Обратите внимание, что шаблон передается awk из переменной оболочки, поэтому он будет принят как регулярное выражение. Кавычки немного забавны, потому что часть кода заключена в одинарные кавычки, затем переменная в двойных кавычках, а затем еще код в одинарных кавычках. как 'foo' "$ var" 'bar'
, но без пробелов. p &&! / ^ * $ /
- если p установлено и строка не пуста (только пробелы между началом и концом), распечатать ее (действие по умолчанию).
Да, и это приведет к сбою и сгоранию, если элементы вашего списка содержат что-нибудь забавное, например пробелы.