我的 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