bash + 使用正则表达式比较字符串

yae*_*ael -2 linux bash shell-script regular-expression

在我的 bash 脚本中我想验证字符串是否是磁盘

所以我做了下面的例子

if [[ $disk =~ sd{a..z} ]];then
echo "we found a disk - $disk
.
.
.
.
fi
Run Code Online (Sandbox Code Playgroud)

但实际上表达式不识别 $disk ( $disk 可以是例如 sda sdb sdc sdd 等)

例如

disk=sdb
[[ $disk =~ sd{a..z} ]] && echo "$disk is real disk"
Run Code Online (Sandbox Code Playgroud)

也不如

[[ $disk =~ 'sd{a..z}' ]] 
Run Code Online (Sandbox Code Playgroud)

我哪里错了?

sch*_*ity 5

=~是一个二元运算符,来自手册3.2.5.2 Conditional Constructs

\n
\n

还可以使用附加二元运算符 \xe2\x80\x98=~\xe2\x80\x99,其优先级与 \xe2\x80\x98==\xe2\x80\x99 和 \xe2\x80\x98 相同!=\xe2\x80\x99。使用时,运算符右侧的字符串被视为 POSIX 扩展正则表达式[...]

\n
\n

{a..z}是大括号扩展 3.5.1大括号扩展

\n
\n

大括号扩展是一种可以生成任意字符串的机制。

\n
\n
\n

所以你需要一个正则表达式模式来匹配字符串:

\n
$ disk=sdb    \n$ [[ $disk =~ ^sd[a-z]$ ]] && echo "$disk is real disk"\n$ sdb is real disk\n
Run Code Online (Sandbox Code Playgroud)\n

  • 或者使用更简单、更便携的(来自 ksh88)“[[ $disk = sd[az] ]]”或者更便携的(标准 sh)“case $disk in (sd[az])...”。请注意,在 `zsh` 中,如果启用了 `rematchpcre` 选项,`[[ $disk =~ ^sd[az]$ ]]` 也可以在 `$'sda\n'` 上匹配。使用 PCRE,您需要“\z”来匹配主题末尾。`[az]` 是否仅匹配 `abcdefghijklmnopqrstuvwxyz` 还取决于操作员、系统、shell、shell 版本和区域设置。 (3认同)