Как я могу изменить переменные

Я не полагаю, что регулярное выражение возможно динамично настроить конфигурацию 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
0
20.10.2013, 02:15
5 ответов

Должен там так или иначе выбрать числа переменной: 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
3
28.01.2020, 02:13

Можно использовать некоторых 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; }
2
28.01.2020, 02:13

Можно настроить список как переменную типа массив.

#!/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.

2
28.01.2020, 02:13

Данный $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
1
28.01.2020, 02:13

Изменение Внутреннего разделителя полей (IFS) может быть опасным, поскольку это, s переменная в масштабе всей системы и много приложений полагается на свое значение по умолчанию. Таким образом, рекомендуется, чтобы Вы сохранили и восстановили его исходное значение каждый раз, когда необходимо изменить его.

Пример с помощью предыдущего предложения:

#!/bin/bash
col=1,3,4,
OLD_IFS=$IFS 
IFS=","
for i in $col; do 
  echo "i= $i"
done
IFS=$OLD_IFS
0
28.01.2020, 02:13
  • 1
    То, что Вы говорите, корректно: изменение IFS и не задержка его может быть опасным. Но почему восстановление беспокойства IFS когда можно выполнить последовательность команд в подоболочке? Например. ( IFS=","; for i in ... done ). Затем ток IFS не будет изменен. –   19.10.2013, 15:13
  • 2
    Если "пример с помощью предыдущего предложения" будет всем этим затем, то это будет, если выполняется открывать subsheell также, делая возврат IFS избыточный, поскольку переменная не экспортируется на ее родителя. –  Petter H 19.10.2013, 15:15
  • 3
    Да, это верно, что в этом упрощенном примере, это избыточно для волнения о восстановлении IFS. Однако в более длинном и более сложном сценарии можно, конечно, столкнуться странный и твердый отладить проблемы, если Вы не осторожны при изменении IFS. Так, я полагаю, что эмпирическое правило всегда сохраняет исходное значение IFS как гарантию так или иначе. Идеально, я искал бы альтернативные методы, которые не включат изменение IFS вообще. –  Luis Nardella 19.10.2013, 15:32

Теги

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