мы протестировали следующий скрипт - script.sh
на имени хоста машины - presto-data1-01
, но, похоже, регулярное выражение presto-data+([[:digit:]])
недостаточно хорошо
Хосты машин приведены в качестве примера:
presto-data1-01
presto-data1-02
presto-data1-03
или
presto-data2-01
presto-data2-02
presto-data2-03
и т. д.
мой сценарий и пример
more /tmp/script.sh
#!/usr/bin/env bash
hostname=$(hostname -s)
shopt -s extglob
case $hostname in
presto+([[:digit:]]))
bash /home/presto.sh;;
presto-data+([[:digit:]]))
bash /home/presto-data.sh;;
*) echo "Unrecognized hostname $hostname" ;;
esac
bash /tmp/script.sh
Unrecognized hostname presto-data1-01
имя моей машины:
[root@presto-data1-01 # hostname -s
presto-data1-01
что нам нужно исправить в регулярном выражении - presto-data+([[:digit:]])
, чтобы, например, соответствовать presto-data1
и игнорировать символы после presto-data1
как "-01
"
Вы хотите сопоставить presto01
и presto-data1
, но не presto-data1-01
? Или вы хотите частичное совпадение для presto-data1
в presto-data1-01
?
нам нужно частичное совпадение для presto-data1 , поэтому даже имя машины — presto-data1-01 или presto-data1-02 и т. д., тогда регулярное выражение будет соответствовать presto-data1
вот пример полного совпадения - presto-data+([[:digit:]])?(-)+([[:digit:]]) , это работает, но, как я объяснил, нам нужно true при частичном совпадении
так presto99abc
должно совпадать?
должен presta九七二
совпадать?
Я говорю о presto-data1 и на самом деле presto-data[0-9] , я обновляю свой вопрос, поскольку детали путаются.
Не путайте шаблоны регулярных выражений и glob, вы используете glob.
Используйте *
, чтобы игнорировать последние символы.
#!/usr/bin/env bash
hostname=$(hostname -s)
shopt -s extglob
case $hostname in
presto+([[:digit:]])*)
bash /home/presto.sh;;
presto-data+([[:digit:]])*)
bash /home/presto-data.sh;;
*) echo "Unrecognized hostname $hostname" ;;
esac
Использование расширения параметров read
и
hostname='presto-data1-01'
IFS='-' read pr data id <<< "${hostname}"
echo "$pr '${data%%[0-9]}' $id"
if [ "${data%%[0-9]*}" == 'data' ];then
echo "data host"
else
echo "other"
fi
результат
presto 'data' 01
data host
чему оно должно не соответствовать?