Попробуйте следующий скрипт:
#!/usr/bin/env bash
shopt -s nocasematch
for word in $(grep -i "^[^#\S]*Host\(name\)\?" ~/.ssh/config | paste -s -); do
case "$word" in
"Host")
type=host
;;
"Hostname")
type=hostname
;;
*)
case "$type" in
"host")
host=$word
;;
"hostname")
hostname=$word
if [[ "$hostname" == *uberspace.de ]]; then
ssh -v $host "git -C bin pull" # Connecting to $hostname
fi
unset host hostname
;;
esac
esac
done
Первый цикл grep
for
- перехватывать все строки с помощью Host
и Hostname
. Затем tr
соединяет их все вместе в одну строку. Тогда это вопрос парсинга каждого отдельного слова.
Разбор каждого слова реагирует на слова Host
и Hostname
(нечувствительно, когда nocasematch
), когда эти ключевые слова найдены, то в зависимости от их типа они присваиваются переменной host
и hostname
. Поскольку ожидается, что значение для имени хоста будет последним, мы выполняем нашу команду там, как только имя хоста uberspace.de
. После того, как мы закончим разбор имени хоста, мы сбрасываем значения, чтобы мы могли подобрать новое.
Чтобы отладить скрипт, запустите его как: bash -x ./script.sh
.