bash 脚本中的逻辑 AND

bash 脚本中的逻辑 AND

我的 bash 脚本中有一个if必须检查这两个文件中的任何一个是否存在,如果它们不存在,则应该回显匹配。

我有代码:

if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi

但这似乎由于某种原因不起作用。

我 110% 确定这两个文件不存在。我没有收到任何错误,它只是没有进入if.

我是 bash 脚本新手,所以我不确定可能出了什么问题。

答案1

如果你想任何一个那么你想要的OR,不是AND

if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi
  • 如果其中一个或两个文件丢失,这将匹配。
  • 您的代码只会打印match您的代码仅在以下情况下两个都不存在。

, 你说:

我 110% 确定这两个文件不存在。我没有收到任何错误,只是没有输入 if 。

所以你的说法是自相矛盾的。至少其中一个文件必须存在,如果你在跑步代码。

如果您想查看if语句的评估情况,请使用 运行它-x

#!/bin/bash -x
if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi

然后你就会看到执行过程。

$ ./test.sh
+ [[ ! -f /etc/benchmarking/code ]]
+ [[ ! -f /etc/benchmarking/code.class ]]
+ echo match
match
$ 

答案2

不应该是这样吗? A是一个文件或者B是一个文件,然后blabla。

if [[ -f /etc/benchmarking/code ]] || [[ -f /etc/benchmarking/code.class ]]; 
then  
  echo "match"
fi

答案3

这也可能适合您正在尝试做的事情。如今,单括号不常与 一起使用bash,但这仍然是一种选择。使用-o实际上是“OR”运算,并且!否定条件。

var=/etc/benchmarking/code
[ ! -f "$var" -o ! -f "$var.class" ] && echo "match"

答案4

match您的代码满足您的要求:如果找不到任何一个文件,它将打印。

match因此,未打印的原因是在其他地方。您应该确认已到达代码块,这可以通过用几条调试消息包围它来完成。例如,像这样:

echo '@ About to enter if...fi block'
if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi
echo '@ Finished if...fi block'

我通常的偏好是调试消息转到标准错误以避免中断数据流标准输出,但我在这里避免了这一点,因为你说你是初学者。这是一个示例,展示了如何写入标准错误:

echo '@ About to enter if...fi block' >&2

相关内容