2012-01-31 113 views
1

我有我的UNIX脚本文件中的以下行:UNIX脚本错误

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

由于明确了线检查两个文件存在于一个目录,如果这两个文件都存在,一些逻辑将被执行。

但是,在运行该脚本我正在上面线以下错误:

test_script: line 30: syntax error at line 54: `]' unexpected 

线54就是上面一行出现。

这个错误是什么意思?我错在哪里?

感谢您的阅读!

回答

1

对于最常见的壳体,至少[]不像C中的圆括号,然后用它来对子表达式进行分组。

你需要的是像(为bash):

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

如果你想与特定的帮助(非bash)外壳,你应该让我们知道你正在使用哪一个。

0

你有额外的[]

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

基本上,你是混合两种语法的目的是做同样的事情:即[ ][[ ]]。前者更便携,但后者更强大;尽管你会遇到的大部分炮弹都支持[[ ]]

但更好的方法是,因为你已经在使用[[ ]]构建

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

它有多种答案解释之间的细微差别有趣[和[,但由于某些原因,我们的文化似乎从提供显而易见的解决方案劝阻的人。停止使用'['完全。而不是“[”,使用的测试:

 
if test -f $DIR1/$FILE1 && test -f $DIR1/$FILE2; then 

测试比“[”更清晰的语法,这需要一个最终的“]”的说法不断迷惑人,以为括号内是语言的一部分。 '[''不是可移植的,并且让那些没有意识到许多shell提供非标准功能的人感到困惑。有一种情况是[[可以比[更高效],但是如果运行时性能在你的shell中是一个问题,那么你可能不应该在sh中解决这个问题。

0

由于@paxdiablo所述,您可以使用这种方式:

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

,或者你可以用这种方式:

if -f $DIR1/$FILE || -f $DIR1/$FILE2 ;