По части 1: Да, оба шаблона будут соответствовать 1, 2 или 3.
Часть ответа на ваш первый вопрос - это ваш второй вопрос. Как ни странно.
Круглые скобки используются для включения обратных ссылок и уточнения приоритета / группировки операторов.
Квадратные скобки заключают символьный класс . Они используются для сопоставления одного экземпляра набора символов внутри.
Например, \ (hello \)
будет соответствовать слову «hello», а также поместит его в соответствующую переменную обратной ссылки ( \ 1
, \ 2
и др.)
С другой стороны, [привет]
будет соответствовать ОДНОМУ символу, одному из набора {e, h, l, o}.
Некоторые дополнительные данные (просто дополнительная информация):
Обратные ссылки основаны на последовательности открытых пар, а не закрытых. С вложенными паренами это может стать важным. Игнорирование escape-символов для удобства чтения - (this (that) (the other))
приведет к \ 1
, содержащему this that the other
; \ 2
, содержащий тот
и \ 3
, содержащий другой
.
Подсчет класса символов проверяет наличие дополнительных экземпляров этого класса символов. Они не должны совпадать одинаково. Например, [0-9]
будет соответствовать одной цифре, а [0-9] {5}
будет соответствовать любым пяти цифрам. Если вы хотите сопоставить только 5 повторяющихся цифр, например соответствует 77777 или 33333, но не 37497, используйте обратную ссылку: \ ([0-9] \) \ 1 {4}
Если вы знаете разницу между вашими хостами для разработки и рабочими хостами или если существует простое соглашение об именах (e. г. dev.example.com
против prod.example.com
), это может быть так же просто, как:
for host in $(</home/completelistlistcheck.txt); do
case "$(ssh $host hostname)" in
*dev*)
env="development"
break
;;
*prod*)
env="production"
break
;;
*)
env="non-categorized"
break
;;
esac
echo "$host is a $env host."
done
Если на каждом хосте есть файл, содержимое которого вам нужно проанализировать, используйте cat /path/to/file
вместо hostname
в команде, запускаемой через ssh
.
Есть несколько проблем:
имя хоста
Если ваш логин не гарантирует, что эта переменная существует, вы должны использовать вместо нее команду hostname
:
chk=$(hostname)
сш
ssh $host
просто входит в систему и ждет ввода с терминала. Следующая команда выполняется после выхода ssh
. Вы должны добавить команду к вызову ssh
. Было бы слишком много передавать весь материал case
в ssh
, но, насколько я понимаю, вам нужен только результатhostname
:
chk="(ssh "$host" hostname)"