在KornShell中检查多个大小大于零的文件

时间:2018-10-18 08:40:58

标签: linux shell ksh file-handling

下面是一个简单的脚本,用于查找是否所有文件都存在并且大小是否大于零。从here中,我知道任务使用了'-s'。

if [ -s ${file1} && -s ${file2} && -s ${file3}]; then
   echo "present"
   echo "Perform analysis"
else
   echo "not present";

   echo "Value of file1: `-s ${file1}`"
   echo "Value of file2: `-s ${file2}`"
   echo "Value of file3: `-s ${file3}`"
   echo "skip";
fi

文件位于与脚本相同的路径上。我已经检查了文件名,它是正确的。我收到以下错误:

./temp.ksh[]: [-s: not found [No such file or directory]
not present
./temp.ksh[]: -s: not found [No such file or directory]
Value of file1:
./temp.ksh[]: -s: not found [No such file or directory]
Value of file2:
./temp.ksh[]: -s: not found [No such file or directory]
Value of file3:

我似乎无法找出上面的问题。这特定于KornShell吗?我只能使用KSH。

3 个答案:

答案 0 :(得分:1)

参考this问题的答案。错误是在if语句中使用[]而不是[[]],因为[[]]可以解释&&,但是[]不能。

答案 1 :(得分:0)

您似乎误解了同样写为du的{​​{1}}命令。条件表达式可以写在test命令中,但不能用作可执行语句。

所以不要

[ Conditional Expression ]

但是要做

test

此外,echo "Value of file1: `-s ${file1}`" 不会返回大小,而是作为返回码检查大小是否为零。

此外,echo "Value of file1: $( [[ -s ${file1} ]] && echo 0 || echo 1)" 命令不知道-s(如Ankit Chauhun's answer所述)。

所以不要

test

但是可以任何一个

&&

您可能对此感兴趣:

if [ -s ${file1} && -s ${file2} && -s ${file3} ]; then

答案 2 :(得分:0)

其他答案对我来说看起来不错,但我不得不尝试一下才能看到。 这对我有用:

file1=a.txt
file2=b.txt
file3=c.txt

if [[ -s ${file1} && -s ${file2} && -s ${file3} ]]
then
    echo "present"
    echo "Perform analysis"
else
    echo "not present";

    for name in ${file1} ${file2} ${file3}
    do
        if [[ ! -s ${name} ]]
        then
            date > ${name}  # put something there so it passes next time
            echo "just created ${name}"
        fi
    done
    echo "skip";
fi

我将其放入名为checkMulti.sh的文件中,并得到以下输出:

$ ksh checkMulti.sh
not present
just created a.txt
just created b.txt
just created c.txt
skip
$ ksh checkMulti.sh
present
Perform analysis
$ rm a.txt
$ ksh checkMulti.sh
not present
just created a.txt
skip
$ ksh checkMulti.sh
present
Perform analysis

使用单括号[在ksh 88中消失了。我建议始终使用双括号[[这些天。

此外,请检查并确认方括号之前和之后以及破折号之前是否有空格。我只是想重现您的错误而得到(这是错误的):

$ if [[-s fail]]   #<<< missing space before -s and after filename
> then
> echo yes
> fi
-ksh: [[-s: not found [No such file or directory]
$

但是,如果我将所需的空格(并创建一个文件)放入其中,则会得到:

$ date > good  # put something in a file
$ if [[ -s good ]]
> then
>     echo yes
> fi
yes
$