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