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

Check multiple files having size greater than zero in KornShell

下面是一个简单的脚本,用于查明是否所有文件都存在并且大小是否大于零。从 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。

你好像误解了test命令也写成[ Conditional Expression ]。条件表达式可以写在 test 命令中,但不能用作可执行语句。

所以不做

echo "Value of file1: `-s ${file1}`"

但是

echo "Value of file1: $( [[ -s ${file1} ]] && echo 0 || echo 1)"

此外,-s 不是 return 大小,而是检查大小是否为零作为 return 代码。

此外,test命令不知道&&(如所述)。

所以不做

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

但是任何

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

您可能感兴趣:

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

   stat --printf="Value of file1: %s" "$file1"
   stat --printf="Value of file2: %s" "$file2"
   stat --printf="Value of file3: %s" "$file3"
   echo "skip";
fi

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

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

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
$