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

请指教 – 我的语法有什么问题? (不应该打印“糟糕的界面”)

备注 – 我使用bash shell

ETH_NAME=eth0 ( or any other as eth1 or eth2 .... ) echo $ETH_NAME eth0 [ $ETH_NAME != eth[0-9] ] && echo bad interface 

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

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

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

 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 

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

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

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

因为它速度快而且便于携带(不需要使用bash )。 我不能说可用于case正则expression式的子集是一个丰富的正则expression式,但通常是足够的。