我找不到这个答案 - 如果它是重复的,请道歉。
我/bin/sh
在 BSD 上使用(不是bash!),我正在尝试找出以下 IF 语句的语法。
我有两个组成条款。写成单独的语句,它看起来像这样:
if [ "$a" == "y" -o "$a" == "Y" ]; then
if printf '%s' "$b" | grep -qE 'SOME_REGEX'; then
# both conditions met: do stuff
fi
fi
所以我可以使用嵌套if
作为一种解决方法。
但是我需要什么语法才能将它们整齐地组合成一个“if”语句?
注意:如果这个 shell 允许直接的正则表达式匹配比较([ "$a" =~ REGEX" ]
或类似的)而不是 requires grep -q
,这将是有用的,但我仍然想知道如何正确组合这些子句,因为有一天我肯定会有我正在匹配文件内容而第二个语句类似的情况ls -l "$b" | grep -qE 'SOME_REGEX'
,因此内联正则表达式比较不起作用... :)
我个人认为在
if
这里有一个嵌套语句是可以的,尽管我会使用稍微现代化的语法:(注意这
==
是一个bash
-ism)将它们结合起来(恕我直言,使其可读性降低):
对于基本的正则表达式,您可以使用
expr
(请参阅下面 Stéphane Chazelas 的评论):/bin/sh
shell 通常[[ ... =~ ... ]]
不需要做扩展的正则表达式匹配。关于最后的注释:正则表达式用于匹配单行text。如果将文件名视为文本,则会自动取消任何不是单行文本的文件名,例如包含换行符的文件名。如果您需要对文件名应用正则表达式匹配,请谨慎使用存储在数组 (
$@
in/bin/sh
) 中的名称,或使用find
支持-regex
谓词的实现。文件名通配模式用于匹配文件名。
注意
grep
匹配输入的每一行,而不是整个输入,所以一般不适合任意字符串。您可以使用它awk
来代替(注意扩展的正则表达式类似于grep -E
orbash
's所理解的那些[[ string =~ regexp ]]
)。请注意,应避免使用
-a
/二元运算符。-o
[
它们已被 POSIX 弃用,并且存在许多问题。例如,在 FreeBSD 上:您可以通过
$a
连接$b
并添加模式到正则表达式来缩短它请注意, grep 是行匹配工具,因此 \n 在最后