syntax error: unexpected end of file:
如果是在windows环境下编写的shell脚本上传到linux下需要把dos文件转换成unix文件格式,否则会出现报错:syntax error: unexpected end of file:
dos格式文件传输到unix系统时,会在每行的结尾多一个^M,而linux下的是没有的[root@localhost ~]# cat -A linux.txt
linux$
windows$
[root@localhost ~]# cat -A windows.txt
windows^M$
linux 最后一行行末没有换行符;
[root@localhost ~]#
vim windows.txt末尾提示[noeol] 120L, 2532C 信息,'noeol' 就是 'no end-of-line', 即“没有行末结束符”,vim windows.txt,不做任何修改直接 :wq保存退出换行符已经追加上去,
如果提示 "dos.txt" [dos] 120L, 2532C 字样,表示是一个[dos]格式文件,如果是MAC系统的,会显示[MAC],因为文件格式的原因有时会导致我们的unix程序,或者shell程序出现错误,那么需要把这些dos文件格式转换成unix格式,方法是
vi dos.txt
:set fileformat=unix
:w
这样文件就转换成unix格式文件了,或者使用dos2unix
yum -y install dos2unix
dos2unix filename.sh
如果还是报错syntax error: unexpected end of file检查语法
出现中文乱码的问题
此问题是因执行定时任务时没有去获取系统的环境变量,导致了中文乱码。在shell脚本开始的时候加下命令:export
LANG="en\_US.UTF-8"
crontab 里脚本不执行
手动执行脚本正常,加入到crontab里后脚本不执行,这是因为crontab没有读取环境变量,脚本中的部分命令不是用的绝对路径无法找到,可以在脚本开头读取环境变量或者所有命令使用绝对路径[ -f ~/.bash_profile ] && . ~/.bash_profile
[ -f ``/etc/profile``] && . etc/profile
shell脚本中的变量
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
$$ Shell本身的PID(ProcessID)
$! Shell最后运行的后台Process的PID
$- 使用Set命令设定的Flag一览
$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1 是传递给该shell脚本的第一个参数
$2 是传递给该shell脚本的第二个参数
$$ 是脚本运行的当前进程ID号
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$@:是传给脚本的所有参数的列表,即被扩展为"$1" "$2" "$3"等;
$*:是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个,即被扩展成"$1c$2c$3",其中c是IFS的第一个字符;