我正在尝试使用 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)
在测试命令(例如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)
| 归档时间: |
|
| 查看次数: |
545 次 |
| 最近记录: |