测试文件时Linux意外的操作符/操作数

时间:2017-08-16 09:35:31

标签: linux if-statement ksh

我在Linux中使用了以下简单的ksh脚本

#!/bin/ksh
set -x
### Process list of *.dat files
if [ -f *.dat ]
then
print "about to process"
else
print "no file to process"
fi

我当前目录中有以下* .dat文件:

S3ASBN.1708140015551.dat S3ASBN.1708140015552.dat S3ASBN.1708140015561.dat S3HDR.dat 

运行文件命令显示以下内容:

file *.dat
S3ASBN.1708140015551.dat: ASCII text
S3ASBN.1708140015552.dat: ASCII text
S3ASBN.1708140015561.dat: ASCII text
S3HDR.dat:                ASCII text

但是,当我运行ksh脚本时,它会显示以下内容:

 ./test
+ [ -f S3ASBN.1708140015551.dat S3ASBN.1708140015552.dat S3ASBN.1708140015561.dat S3HDR.dat ]
./test[9]: [: S3ASBN.1708140015552.dat: unexpected operator/operand
+ print  no file to process
 no file to process

任何线索我为什么会得到unexpected operator/operand以及有什么补救措施?

1 个答案:

答案 0 :(得分:1)

您的if语句不正确:您正在测试* .dat是否为文件 问题是:*.dat有一个globbing运算符*,它使用.dat创建每个项目endig的列表。
此测试仅运行一次,而您有多个文件,因此可以运行多个测试。

尝试添加循环:

#! /usr/bin/ksh
set -x
### Process list of *.dat files
for file in *.dat
do
  if [ -f $file ]
  then
    print "about to process"
  else
    print "no file to process"
  fi
done

就我而言:

$> ls *.dat
53.dat  fds.dat  ko.dat  tfd.dat

输出:

$> ./tutu.sh 
+ [ -f 53.dat ]
+ print 'about to process'
about to process
+ [ -f fds.dat ]
+ print 'about to process'
about to process
+ [ -f ko.dat ]
+ print 'about to process'
about to process
+ [ -f tfd.dat ]
+ print 'about to process'
about to process