在做实验文件状态测试的过程中,初学shell遇到了几个问题
./test.sh: line 43: syntax error: unexpected end of file
其问题所在是由于shell脚本用Windows的记事本书写,Linux在执行时,其中有不可见的符号
解决方法为:
命令行输入 :
1)vim test.sh
2):set fileformat=unix(注意=前后不能有空格)
3):wq
问题解决
ls: cannot access 'grep': No such file or directory
代码如下,问题出在标注部分
# !binbash
if [ $# -ne 1 ]
then
echo no arg put
exit
fi
if [ -f $1 ]
then
ls -l grep $1//问题所在
ls -l grep $1 cut -d ' ' -f 8 num.txt
num=0
count=0
while [ $num -ne 2 ]
do
sleep 5
read a num.txt
ls -l grep $1 cut -d ' ' -f 8 num.txt
read b num.txt
if [ $a -eq $b ]
then
count=`expr $count + 1`
echo file $1 not changed
else
echo file $1 size changed
num=`expr $num + 1`
count=0
fi
if [ $count -eq 10 ]
then
echo ten times
break
fi
done
if [ $num -eq 2 ]
then
echo two time
fi
exit
else
echo wrong input
fi
exit
看到报错是在命令ls中,找不到参数“grep”的意义,发现grep被误当作ls的参数
解决:命令之间要用 | 分隔开!!!
如何获取文件大小
在实验中,需要反复验证文件大小来确认文件是否改变
一种获取文件的方法是
用命令
ls -l | cut -d ' ' -f 8
来列出指定文件状态并获取文件状态中的文件大小
可见此处 cut 采取了按域定位,以空格划分,但存在问题
当文件大小的长度不同时,f后的参数相应改变
如文件大小为4096和33,文件状态分别为
drwxrwxrwx 1 huihui huihui 4096 Jun 21 21:23
-rwxrwxrwx 1 huihui huihui 33 Jun 21 14:55
由于33前面有三个空格,则上述命令对两个文件分别为
ls -l | cut -d ' ' -f 5
ls -l | cut -d ' ' -f 7
另一种方法为
用命令
ls -l | cut -c 28-31
此处 cut 按字符定位,涵盖了表示文件大小的位数区间,较第一种方法更好
但存在两个问题:1.若存在特别大的文件,位数区间将再次改变 2.对于用户名称长度不同,相应的位数区间也不完全相同
最好的解决方法为
用命令
ls -l | tr -s [:space:] | cut -d ' ' -f 5
其中 tr -s [:space:] 将文件大小前的多个空格合并为一个,于是 cut -d ' ' -f 5 能一定得到文件大小