可以说我必须测试文件是否包含字符串“mail”,两者之间有什么区别
if grep -q "mail" "file"; then ...
if [ $( grep -l "mail" "file") ]; then ...
[ grep -l "mail" "file" ] && ..
这些是否有任何差异,或者它们在全局上是否相同(就像它们在内部或命令中的任何条件下都会导致相同的结果一样)
答案1
if command; then ...
评估 的退出状态command
。 0 表示成功(评估条件为真)。
首先:[
与 几乎相同test
,因此它希望command
字符串符合其语法。
if [ $(command) ]; then ...
计算包含 的输出的字符串command
。在大多数情况下它不起作用 - 请参阅下面的示例。
[ command ] && ..
grep -l "mail" "file"
将被解释如下:
grep
- 一个字符串-l
- 一元运算符返回以下字符串的长度"mail"
- 一个字符串,将作为参数传递给-l
运算符"file"
- 一个字符串
根据实现的不同,您会得到略有不同的错误,因为上面要求[
评估由字符串、数字和另一个字符串组成的序列,而不需要任何运算符。默认情况下[
(以及test
)是内置的 shell,您可以将错误消息与独立二进制文件(通常/bin/[
为 或/usr/bin/[
)进行比较。