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