检查SVN本地代码是否需要更新
check_code_change()
{
FW_PATH=$1
echo "checking if $FW_PATH has been changed"
cd $FW_PATH
revision=$(svn info |grep "Last Changed Rev" |awk '{print $4}')
echo "the revision is $revision"
URL=$(svn info |grep "^URL:" |awk '{print $2}')
echo "the url is $URL"
svnRevision=$(svn info $URL |grep "Last Changed Rev:" |awk '{print $4}')
echo "the revision in svn is $svnRevision"
if [[ $revision < $svnRevision ]] ; then
return 1
else
return 0
fi
}
判断某扩展名文件是否存在
判断某个确定文件名的文件是否存在时可以用-e,但不能接通配符。if [[ -e ./base/*.f1img ]]; then
这种写法在存在多个符合条件的文件时会报错。if [[ -n $(ls ./base/*.f1img) ]]; then
这种写法在不存在符合条件的文件时会报错。if ls ./base/*.f1img >/dev/null 2>&1; then
这种写法在符合条件的文件存在或不存在,1个或多个时都没问题。需要注意到是if后面没有中括号。
中括号[的本质是test,用于条件判断。if不加中括号[用于真假判断,后面直接跟命令,判断的是命令执行结果是否成功。如果成功返回值为0则为真,如果执行失败返回值为非0则为假。
该命令中先用ls尝试去列出./base/*.f1img,然后将标准输入和标准输出都重定向到/dev/null,也就是说不管文件存在还是不存在,ls都什么不打印。if后面没有中括号[,所以判断的不是ls的输出内容,而是ls命令的执行结果。如果文件存在,ls执行成功返回值为0,则if判断为真。如果没有符合条件的文件存在,则ls命令执行失败,返回值为2,if判断为假。
比较两个文件是否相同
#/bin/bash
file1=/tmp/aa
file2=/tmp/bb
diff $file1 $file2 > /dev/null
if [ $? == 0 ]; then
echo "they are same"
else
echo "they are different"
fi
检测文件列表是否有变化
ls *.jar -1 > manifest.tmp
diff manifest.tmp META-INF/IPC_MANIFEST.MF >/dev/null 2>&1
if [[ $? != 0 ]]; then
cp manifest.tmp META-INF/IPC_MANIFEST.MF
rm -f IPC_MANIFEST.MF.sig
PKISign -jar $MODULE_HOME/META-INF/IPC_MANIFEST.MF
fi
rm manifest.tmp
不显示输出
在命令后加>/dev/null 2>&1
/dev/null
:代表空设备文件
> :代表重定向到哪里,例如:echo “123” > /home/123.txt
1 :表示stdout标准输出,系统默认值是1,所以”>/dev/null
“等同于”1>/dev/null
“
2 :表示stderr标准错误
& :表示等同于的意思,2>&1,表示2的输出重定向等同于11 > /dev/null 2>&1
语句含义:1 > /dev/null
: 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。2>&1
:接着,标准错误输出重定向(等同于)标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。
将log文件限制在一定行数内
#!/bin/sh
LOG_FILE=/var/log/messages
TMP_FILE=/var/log/messages.tmp
LINE_LIMIT=10000
if [[ -e $LOG_FILE ]]; then
#check line number of the log file
line_num=$(wc -l $LOG_FILE | awk '{print $1}')
#if exceed line limit, only keep the latest lines
if [[ $line_num -gt $LINE_LIMIT ]]; then
tail -n $LINE_LIMIT $LOG_FILE > $TMP_FILE
rm $LOG_FILE
mv $TMP_FILE $LOG_FILE
fi
fi
检查网络联通性
HOST_IP=192.168.1.101
CheckConnectivity()
{
echo "Checking network connectivity..."
ping -c 10 -o $HOST_IP
if [[ $? == 0 ]]; then
echo "Network is available now!"
return 0
else
echo "The network is unavailable now! try again!"
return 1
fi
}
设置IP地址
SetLocalIP()
{
validIPaddr=0
echo "Please set IP address for this device"
echo -n "if leave it blank, 192.168.1.100 will be used by default:"
read local_ip
if [[ -z ${local_ip} ]]; then
local_ip="192.168.1.100"
fi
verifiedAddr=`echo ${local_ip} | grep -x -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$"`
if [[ -n $verifiedAddr ]] then
validIPaddr=1
fi
until [[ $validIPaddr = 1 ]]
do
echo -n "The IP address you input is incorrect, please try again:"
read local_ip
if [[ -z ${local_ip} ]]; then
local_ip="192.168.1.100"
fi
verifiedAddr=`echo ${local_ip} | grep -x -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$"`
if [[ -n $verifiedAddr ]] then
validIPaddr=1
fi
done
validNetmask=0
echo "Please set netmask for this device"
echo -n "if leave it blank, 255.255.255.0 will be used by default:"
read netmask
if [[ -z ${netmask} ]]; then
netmask="255.255.255.0"
fi
verifiedAddr=`echo ${netmask} | grep -x -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$"`
if [[ -n $verifiedAddr ]] then
validNetmask=1
fi
until [[ $validNetmask = 1 ]]
do
echo -n "The netmask you input is incorrect, please try again:"
read netmask
if [[ -z ${netmask} ]]; then
netmask="255.255.255.0"
fi
verifiedAddr=`echo ${netmask} | grep -x -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$"`
if [[ -n $verifiedAddr ]] then
validNetmask=1
fi
done
ifconfig fec0 $local_ip netmask $netmask
}
执行tftp命令序列
可以将要执行的tftp命令按照顺序写入一个文本文档,然后执行tftp命令时用<符号执行。
例如命令文档tftpcmd_getpackage.txt内容为
verbose
blksize 4096
status
get novar-es3s-firmware.tgz
get f1-qnx-maint.f1img
quit
执行命令为
tftp -e 192.168.1.101 < tftpcmd_getpackage.txt