unix脚本错误

unix脚本错误,unix,scripting,Unix,Scripting,我的unix脚本文件中有以下行: if [[ -f $DIR1/$FILE1 ] -a [ -f $DIR1/$FILE2 ]]; then 当清除时,该行检查目录中是否存在两个文件,如果两个文件都存在,将执行一些逻辑 但是,在运行脚本时,我在上一行遇到以下错误: test_script: line 30: syntax error at line 54: `]' unexpected 第54行是存在上述行的地方 这个错误意味着什么?我错在哪里 谢谢你的阅读 至少对于最常见的shell,[]

我的unix脚本文件中有以下行:

if [[ -f $DIR1/$FILE1 ] -a [ -f $DIR1/$FILE2 ]]; then
当清除时,该行检查目录中是否存在两个文件,如果两个文件都存在,将执行一些逻辑

但是,在运行脚本时,我在上一行遇到以下错误:

test_script: line 30: syntax error at line 54: `]' unexpected
第54行是存在上述行的地方

这个错误意味着什么?我错在哪里


谢谢你的阅读

至少对于最常见的shell,
[]
不像C中的圆括号,在圆括号中您可以使用它来分组子表达式

您需要的是(对于
bash
):


如果您需要有关特定(非
bash
)shell的帮助,您应该让我们知道您正在使用哪个shell。

您有额外的
[
]

if [ -f $DIR1/$FILE1 -a -f $DIR1/$FILE2 ]; then
基本上,您混合了两种语法,目的是做相同的事情:即
[]
[[]]
。前者更便于携带,但后者更强大;尽管您遇到的大多数shell都支持
[[]]

但是更好的是,下面的内容,因为您已经在使用
[[]]
构造

if [[ -f $DIR1/$FILE1 && -f $DIR1/$FILE2 ]]; then

不需要带-f的[]

if [ -f $DIR1/$FILE1 -a -f $DIR1/$FILE2 ]; then
输出:

shadyabhi@archlinux /tmp $ touch foo;touch foo2
shadyabhi@archlinux /tmp $ if [ -f "foo"  -a -f "foo2" ]; then echo "Hello"; fi
Hello
shadyabhi@archlinux /tmp $

有趣的是,有多种答案解释了[和[[]之间的细微差异,但出于某种原因,我们的文化似乎不鼓励人们提供明显的解决方案。完全停止使用“[”。而不是“[”,使用测试:

if test -f $DIR1/$FILE1 && test -f $DIR1/$FILE2; then 如果test-f$DIR1/$FILE1&&test-f$DIR1/$FILE2;则
Test的语法比“[”更清晰,后者需要一个最终的“]”参数,并不断地让人们误以为括号是语言的一部分。“[[”是不可移植的,并且让那些没有意识到许多shell提供了非标准的额外功能的人感到困惑。有一个理由可以证明这一点[[可能比[]更有效,但如果运行时性能是shell中的一个问题,您可能不应该在sh中解决该问题。

正如@paxdiablo所述,您可以这样使用它:

if  -f $DIR1/$FILE1 && -f $DIR1/$FILE2 ; then
if -f $DIR1/$FILE || -f $DIR1/$FILE2 ;
或者您可以这样使用它:

if  -f $DIR1/$FILE1 && -f $DIR1/$FILE2 ; then
if -f $DIR1/$FILE || -f $DIR1/$FILE2 ;