bash脚本中的逻辑AND


10

我的ifbash脚本中有一个必须检查2个文件是否存在的文件,如果不存在,则应回显匹配。

代码我有:

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

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

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

我是bash脚本的新手,所以不确定是否可能出问题。


我认为发布的答案均未解决该问题。单独尝试测试会怎样?做[[ ! -f /etc/.../... ]]; echo $?每个。
jw013 2012年

警告[[ -f xxx ]]如果xxx存在为常规文件(或指向常规文件的符号链接),则返回true 。如果它不存在,或者无法分辨它是否存在,或者是否存在但不是常规文件(目录,管道,设备,套接字...),或者它是一个符号链接,它将返回false。到一个不存在的文件,或者无法判断该文件是否存在或不是常规文件... [[ -e $file ]] || [[ -L $file ]]更接近于存在性测试。ls -d -- "$file" > /dev/null 2>&1更近了。通常,这种测试会导致比赛条件。也许还有另一种方式。
斯特凡Chazelas

Answers:


12

如果你想要么,你想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
$ 

我希望它在两个文件都不存在时回显“匹配”,如果一个文件确实存在则不打印匹配。我将使用-x进行尝试
Peppercat101'9

在这种情况下,您的原始代码应该没问题。确实对我有用。
bahamat 2012年

3

那不是这样吗?A是文件,或B是文件,然后blabla。

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

3

这也可能适用于您要尝试执行的操作。bash如今在bash中并不常用,但这仍然是一个选择。使用“ -o”实际上是“或”运算,而“!” 否定条件。

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

永远不要使用[bash。除此之外,我看不到如何回答这个问题。
jw013 2012年

[ ! -f ${var} -a ! -f {var}.class ] && echo "match"它应该是。他们的追求是:如果它们都不存在,就应该echo match
hschou

0

您的代码满足您的要求: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'

我通常的偏爱是调试消息到stderr,以避免中断到stdout的数据流,但是我在这里避免了这一点,因为您说您是初学者。这是一个示例,显示了如何写入stdout

echo '@ About to enter if...fi block' >&2
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.