我正在尝试使用 Bash 中的 new-test 编写复合 if 语句。我想检查一个文件是否存在以及另外两个文件是否具有特定内容。当嵌套在测试中时,我的 grep 搜索似乎效果不佳。
echo "a" >> file_a
echo "b" >> file_b
echo "c" >> file_c
if [[ -f file_a && \
$(grep -q "b" file_b) && \
$(grep -q "c" file_c) ]]; then
echo "Got 'em"
fi
在测试命令的退出状态(例如
grep
)时,您不需要或不想要[[ ]]
或$( )
或任何这些东西。检查andif
之间的任何内容的退出状态,并根据它是成功还是失败采用适当的分支。if
then
$( )
存在以捕获命令的输出(即它在运行时打印的内容 -grep -q
不打印任何内容),并将其用作另一个命令的一部分。这根本不是你想要的。[[ ]]
评估一个测试表达式(它可以测试一个文件是否存在,两个字符串是否相等等),并将结果转换为退出状态。但是由于grep -q
它已经产生了退出状态,因此您不需要进行某种测试即可将其变为该形式。您确实需要
[[ ]]
检查 file_a 是否存在,但这是它在这里发挥的唯一作用。并且您需要&&
创建一个复合命令,该命令只有在它的所有部分都成功时才会成功。所以你想要的是:您可以从 grep 中删除并使用标志
-q
测试命令替换中的表达式是否不为空。-n
虽然
-n
可以省略,但它的工作方式就像您-n
在测试中有标志一样。通常, 如果您只是要使用 grep 测试模式匹配,则不需要
if
子句和[[
or 。[
或者,完全摆脱“如果”:
grep
成功时退出代码为 0,但需要test
一个真实值。您必须反转 grep 的退出代码或检查它是否以 0 退出:或者
理想情况下,有一种比将其放入带有
$()
.