bash + 如何匹配包含字符和数字的字符串

bash + 如何匹配包含字符和数字的字符串

请提供建议 - 我的语法有什么问题?(不应该打印“坏界面”)

备注-我使用 bash shell

ETH_NAME=eth0         ( or any other as eth1 or eth2 .... )
echo $ETH_NAME

eth0 



[ $ETH_NAME  != eth[0-9] ] && echo bad interface

答案1

使用[[ ... ]]可以进行模式匹配的复合命令!=

$ ETH_NAME=eth0
$ [[ $ETH_NAME != eth[0-9] ]] && echo bad interface
$ ETH_NAME=eth01
$ [[ $ETH_NAME != eth[0-9] ]] && echo bad interface
bad interface

答案2

或者使用标准(POSIX sh)case语句而不是 ksh 的语句[[...]](在 bash 和 zsh 中也可以找到)。

case $ETH_NAME in
  (eth[0-9]) ;;
  (*) echo >&2 bad interface
esac

请注意,它会说 eth10 是一个坏接口。

你可以这样做

case $ETH_NAME in
  (eth|eth*[!0-9]*) echo >&2 bad interface;;
  (eth*) ;;
  (*) echo >&2 bad interface
esac

(请注意,包括以太网在内的网络接口名称不限于ethx)。

答案3

我最喜欢的匹配方式是case…esac

case "$ETH_NAME" in
    eth[0-9]) ;;
    *) echo 'bad interface' ;;
esac

因为它是快速地而且相当便携(不需要使用bash)。我不能说可用的正则表达式子集case很丰富,但通常已经足够了。

相关内容