Я не полагаю, что регулярное выражение возможно динамично настроить конфигурацию SSH. Однако необходимо смочь использовать для цикла в Bash для автоматического создания этих трех строк в файле конфигурации для каждого сервера. Для этого примера я предположу, что необходимо создать записи для серверов про75 к про125.
for i in $(seq 75 125);
do
echo "Host pro-$i" >> ~/.ssh/config
echo "Hostname 192.168.1.$i" >> ~/.ssh/config
echo "ProxyCommand ssh production-server nc %h %p" >> ~/.ssh/config
echo "\n" >> ~/.ssh/config
done
Это создаст список всех чисел от 75 до 125 и хранилище что как список для цикла. Это затем циклы через каждого члена списка и $i замен. Каждая строка добавляется в конец файла конфигурации пользователя SSH. Наконец, я включал новую строку для разбивания конфигурационного файла просто немного.
Если у Вас есть определенные значения, которые необходимы в списке, а не непрерывном сегменте чисел, то создают список вручную, как это:
1 23 45 67 89
Должен там так или иначе выбрать числа переменной: 1 3 4 и работа с ними?
$ col=1,3,4,; IFS=","; for i in $col; do echo "i= $i"; done
i= 1
i= 3
i= 4
Но изменяя Внутреннего Разделителя полей (IFS
) может быть опасным, поскольку это - переменная в масштабе всей системы, и много приложений полагаются на ее значение по умолчанию. Таким образом, рекомендуется, чтобы Вы сохранили и восстановили его исходное значение каждый раз, когда необходимо изменить его.
$ col=1,3,4,
$ OLDIFS=$IFS
$ IFS=","; for i in $col; do echo "i= $i"; done
i= 1
i= 3
i= 4
$ IFS=$OLDIFS
Можно использовать некоторых read
волшебство:
i=1,2,3,; echo $i | { IFS=","; read a b c; echo "$a|$b|$c"; }
i=1,2,3,; read a b c <<<$(IFS=","; echo $i); echo "$a|$b|$c"
i=1,2,3,; echo $i | { while read -d\, j; do echo $j; done; }
Можно настроить список как переменную типа массив.
#!/bin/bash
col=1,3,4
declare -a colArray=($(echo $col | tr ',' ' '))
echo ${#colArray[@]} # number of elements in the array
echo ${colArray[0]} # first element of the array
for i in $(seq 0 $((${#colArray[@]}-1))) # loop through the array
do
echo ${colArray[$i]}
done
Цикличное выполнение через может быть сделано несколько различных путей, я просто выбрал тот. Намного более безопасный, чем бездельничание с IFS.
Данный $col
просто строка, только необходимо преобразовать те запятые (,
) к пробелам, и Вы сможете использовать цикл такой как for
выполнить итерации через них.
Вот 2 метода, с помощью sed
в 1-м, и поиск и средство замены в Bash:
$ echo $col | sed 's/,/ /g'
1 3 4
$ echo ${col//,/ }
1 3 4
Если Вы выборочно хотите одно из значений, Вы могли бы использовать cut
вместо этого:
$ echo $col | cut -d"," -f1
1
$ echo $col | cut -d"," -f2
3
$ echo $col | cut -d"," -f3
4
Вот sed
решение с циклом, когда мы "идем" через значения $col
.
$ for i in $(echo $col | sed 's/,/ /g'); do echo $i; done
1
3
4
Каждый раз через цикл мы могли помещать $col
значения в другую переменную или выполнение вообще, это - Вы, должны сделать, поскольку Вы выполняете итерации через $col
.
for i in $(echo $col | sed 's/,/ /g'); do
...use $i in here...
done
Изменение Внутреннего разделителя полей (IFS) может быть опасным, поскольку это, s переменная в масштабе всей системы и много приложений полагается на свое значение по умолчанию. Таким образом, рекомендуется, чтобы Вы сохранили и восстановили его исходное значение каждый раз, когда необходимо изменить его.
Пример с помощью предыдущего предложения:
#!/bin/bash
col=1,3,4,
OLD_IFS=$IFS
IFS=","
for i in $col; do
echo "i= $i"
done
IFS=$OLD_IFS
IFS
и не задержка его может быть опасным. Но почему восстановление беспокойства IFS
когда можно выполнить последовательность команд в подоболочке? Например. ( IFS=","; for i in ... done )
. Затем ток IFS
не будет изменен.
–
19.10.2013, 15:13
IFS
избыточный, поскольку переменная не экспортируется на ее родителя.
– Petter H
19.10.2013, 15:15