`/bin/sh` shell 中的正则表达式

`/bin/sh` shell 中的正则表达式

我想删除 shell 中特定目录中以给定扩展名集结尾的所有文件/bin/sh。我可以这样/bin/bash做 :regex

rm path/(*.pdf|*.png)

但这似乎不适用于普通 sh。正常吗?有没有某种正则表达式support

答案1

不,这在严格兼容 POSIX 的 shell 中不起作用。这是规范性参考:

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13_03

正如您所看到的,绝对没有正则表达式,甚至没有 {a,b} 大括号表示法。

答案2

如中所述用户3188445的回答这不符合 POSIX 标准。

但是,如果您无论如何都想这样做,则必须使用另一个工具,例如find

find dir/ -maxdepth 1 -type f -regex ".*.pdf\|.*.png" -delete

find搜索 dir dir/,不是递归 ( -maxdepth 1),只找到文件 ( -type f)。正则表达式匹配 .pdf 和 .png 文件并-delete删除找到的文件。

答案3

要检查 /bin/sh 真正使用的 shell,请调用:

/bin/sh whatshell.sh

并从此页面获取 Whatshell 脚本:

http://www.in-ulm.de/~mascheck/various/whatshell/

打电话给例如wget http://www.in-ulm.de/~mascheck/various/whatshell/whatshell.sh

典型输出:

$ sh whatshell.sh
SVR4 Bourne shell (SunOS 5 variant)

$ bosh whatshell.sh
SVR4 Bourne shell (SunOS 5 schily variant)

$ bash whatshell.sh
bash 3.2.25(1)-release

$ ksh whatshell.sh 
ksh88 Version (..-)11/16/88i

$ ksh93 whatshell.sh
ksh93 Version M 1993-12-28 s+

POSIX 不需要 /bin/sh 中的 POSIX shell。如果您想运行 POSIX shell 调用:

PATH=`getconf PATH` export PATH
sh

请注意,如果这导致运行 bash,则该 shell 预计不符合 POSIX 标准。

相关内容