bash case glob 以便匹配主机名的一部分并忽略最后一个字符

问题描述 投票:0回答:3

我们在机器主机名上测试了以下脚本 -

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

linux bash shell switch-statement glob
3个回答
0
投票

您是否需要强制执行某种模式,或者简化和重新排序您的全局就足够了?

case $hostname in
    presto-data*)
        bash /home/presto-data.sh;;
    presto*)
        bash /home/presto-data.sh;;
    *)
        printf 'Unrecognized hostname %s\n'  "$hostname" 1>&2;;
esac

0
投票

使用

*
忽略最后一个字符

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

0
投票

使用

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
© www.soinside.com 2019 - 2024. All rights reserved.