在 bash 中复合检查文件内容

tar*_*yte 2 bash

我正在尝试使用 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
Run Code Online (Sandbox Code Playgroud)

Gor*_*son 6

在测试命令(例如grep)的退出状态时,您不需要或不想要[[ ]]$( )或任何这些东西。if检查if和之间的任何内容的退出状态then,并根据它是成功还是失败采用适当的分支。

$( )存在以捕获命令的输出(即它在运行时grep -q打印的内容——不打印任何内容),并将其用作另一个命令的一部分。那根本不是你想要的。

[[ ]]评估测试表达式(可以测试例如文件是否存在,两个字符串是否相等等),并将结果转换为退出状态。但是grep -q它已经产生了退出状态,所以你不需要某种测试来让它变成那种形式。

确实需要[[ ]]检查 file_a 是否存在,但这是它在这里扮演的唯一角色。并且您需要&&创建一个复合命令,只有在它的所有部分都成功时才能成功。所以你想要的是:

...
if [[ -f file_a  ]] && 
  grep -q "b" file_b &&
  grep -q "c" file_c; then
...
Run Code Online (Sandbox Code Playgroud)