1.常量定义在最前面,但是注意shell是解释性的,逐条解释,不能出现:
#!/bin/bash
echo $input1
input1=$1
#打印结果为空
2.命令使用前最好不要加路径,防止跨平台出现问题:
/bin/cp source destination
#最好换成
cp -rf source destionation
3.[ ] 不加双引号判断时,注意不要出现语法错误
input1=$1
[ $1 = 1 ]
#如果输入为空,则出现语法错误
#可以改成
[ x$1 = x1 ]
#或者直接加双引号
[ "$1" = "1" ]
4.简写命令,提高效率
ls | grep .sh
#过滤了当前目录中含有.sh的文件
ls *.sh
#直接过滤出来了后缀是.sh的文件
5.获取文件名前缀、后缀
#前缀
fileNamePrefix=${fileName%.*}
#后缀
fileNameSuffix=${var#.*}
6.命令后台执行
nohup node ${fileNamePrefix}.js >>/cloudEng/log/iniNodeJs.log 2>&1 &
7.sed命令
sed -i "${accountResultLineNum},${accountResultLineNum}c ${userName} = ${userNewPassword}" ${passwordFilePath}
#把某行的内容替换成 用户名 = 密码
8.给文件加锁执行命令
flock -e -w 3 /var/lock/svnLock/passwdLock -c `fun` &>>$logFile
#使用排它锁锁住文件,如果被锁,等待3秒,执行函数
9.ssh无严格认证链接到远程,获取某个日志文件的倒数多少行,写入到本地文件中
ssh -o StrictHostKeyChecking=no ${projectDeployAddr} "tail -n $lineNumber $logFile" > $file
10.内置变量$LINE,可以用来标志出出错的行号
function error_exit {
echo $(date --rfc-2822): "$1" &>>$logFile
echo 1
exit 1
}
error_exit "${LINENO}:failed, can not ping to ${svnClientIpAddress}"