мы протестировали следующий скрипт - 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
чему оно должно не соответствовать?