Linux-Unix-Shell实战实例
1 shell中如何判断一个变量是否为空
1. 变量通过" "引号引起来
如下所示:,可以得到结果为 ISNULL.
#!/bin/sh
para1=
if [ ! -n "$para1" ]; then
echo "IS NULL"
else
echo "NOT NULL"
fi
2. 直接通过变量判断
如下所示:得到的结果为: ISNULL
#!/bin/sh
para1=
if [ ! $para1 ]; then
echo "IS NULL"
else
echo "NOT NULL"
fi
3. 使用test判断
得到的结果就是: dminis not set!
#!/bin/sh
dmin=
if test -z "$dmin"
then
echo "dmin is not set!"
else
echo "dmin is set !"
fi
4. 使用""判断
#!/bin/sh
dmin=
if [ "$dmin" = "" ]
then
echo "dmin is not set!"
else
echo "dmin is set !"
fi
2 Shell 参数打印和拼接
#!/bin/sh
NUMBER=$#
echo $NUMBER
i=1
while [ $i -le $NUMBER ]
do
a[$i]=$1 #将数组a[i]赋值为$1,即取得到第一个参数并将值存入a[1]
echo ${a[$i]}
((i++))#数组后移一位,变为a[2]
shift#使用shift命令将参数后移一位,即此时的$1为第二个参数,具体使用详见下面内容。
done
代码如下:
#!/bin/bash
count=$#
cmd=echo
while [ $count -gt 0 ]
do
cmd="$cmd\$$count"
count=`expr$count - 1`
done
eval $cmd
3 linux shell 各种比较运算符
x sshell 编程中使用到得if语句内判断参数
–b 当file存在并且是块文件时返回真
-c 当file存在并且是字符文件时返回真
-d 当pathname存在并且是一个目录时返回真
-e 当pathname指定的文件或目录存在时返回真
-f 当file存在并且是正规文件时返回真
-g 当由pathname指定的文件或目录存在并且设置了SGID位时返回为真
-h 当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效
-k 当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真
-p 当file存在并且是命令管道时返回为真
-r 当由pathname指定的文件或目录存在并且可读时返回为真
-s 当file存在文件大小大于0时返回真
-u 当由pathname指定的文件或目录存在并且设置了SUID位时返回真
-w 当由pathname指定的文件或目录存在并且可执行时返回真。一个目录为了它的内容被访问必然是可执行的。
-o 当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用户拥有时返回真。
UNIX Shell 里面比较字符写法:
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-le 小于等于
-ge 大于等于
-z 空串
= 两个字符相等
!= 两个字符不等
-n 非空串
-------------------------------------------------------------------------
更为详细的说明:
运算符 描述 示例
文件比较运算符
-e filename 如果 filename 存在,则为真 [-e /var/log/syslog ]
-d filename 如果 filename 为目录,则为真 [-d /tmp/mydir ]
-f filename 如果 filename 为常规文件,则为真 [-f /usr/bin/grep ]
-L filename 如果 filename 为符号链接,则为真 [-L /usr/bin/grep ]
-r filename 如果 filename 可读,则为真 [-r /var/log/syslog ]
-w filename 如果 filename 可写,则为真 [-w /var/mytmp.txt ]
-x filename 如果 filename 可执行,则为真 [-L /usr/bin/grep ]
filename1 -nt filename2 如果 filename1 比 filename2 新,则为真 [/tmp/install/etc/services -nt /etc/services ]
filename1 -ot filename2 如果 filename1 比 filename2 旧,则为真 [/boot/bzImage -ot arch/i386/boot/bzImage ]
字符串比较运算符(请注意引号的使用,这是防止空格扰乱代码的好方法)
-zstring 如果 string 长度为零,则为真 [-z $myvar ]
-nstring 如果 string 长度非零,则为真 [-n $myvar ]
string1 = string2 如果 string1 与 string2 相同,则为真 [$myvar = one two three ]
string1 != string2 如果 string1 与 string2 不同,则为真 [$myvar != one two three ]
算术比较运算符
num1 -eqnum2 等于 [3 -eq $mynum ]
num1 -nenum2 不等于 [3 -ne $mynum ]
num1 -ltnum2 小于 [3 -lt $mynum ]
num1 -lenum2 小于或等于 [3 -le $mynum ]
num1 -gtnum2 大于 [3 -gt $mynum ]
num1 -genum2 大于或等于 [3 -ge $mynum ]
4 shell 整型变量自增(加1)的几种方法
#!/bin/sh
a=1
a=$(($a+1))
a=$[$a+1]
a=`expr $a + 1`
let a++
let a+=1
((a++))
echo $a
5 LINUX Shell:ping所有主机的shell脚本
#从/etc/hosts文件中找出主机信息,过滤后剩下IP项,再ping该主机.
cat /etc/hosts | grep -v ^# |grep -v ^$ | while read LINE
do
for M in `awk '{print $1}'`
do
ping -c1 $M
done
done
注释:
cat file是显示文件.
grep是文本过滤,-v选项是显示不包含匹配文本的行,^#表示以#开头的行.
grep -v ^# 表示不显示以#开头的行.
grep -v ^$ 表示不显示空行.
通过管道(|)的方式把前者的输出作为后者的输入.
并用while读取只有IP的文本的每一行.
用awk命令来输出该IP串.注意,`awk '{print $1}'`里,外面是用反引号引起来的,里面的是单引号.要区分开来,反引号表明这是一个命令.而单引号是awk要求的.
再用for来遍历每行IP串,在for里进行ping主机.用了-c选项,这样可以在ping了c选项指定的次数后退出ping命令.否则会一直ping下去的
6 Shell比较两个日期的大小
#!/bin/bash
date1="2008-4-09 12:00:00"
date2="2008-4-10 15:00:00"
t1=`date -d "$date1" +%s`
t2=`date -d "$date2" +%s`
if [ $t1 -gt $t2 ]; then
echo "$date1 >$date2"
elif [ $t1 -eq $t2 ]; then
echo "$date1 ==$date2"
else
echo "$date1 <$date2"
fi
应用场景:用于时间限制(00:00:00-01:15:00)
var=`date "+%H:%M:%S"`
t1=`date -d "$var" +%s`
date1="00:00:00"
t2=`date -d "$date1" +%s`
date2="01:15:00"
t3=`date -d "$date2" +%s`
if [ $t1 -ge $t2 ] && [ $t1 -le$t3 ];then
echo "TIME:"$var
echo "return 1"
exit 1
else
echo "TIME:"$var
echo "return 0"
exit 0
fi
7 删除目录下指定文件的shell脚本语句
find . -name "[LTE,master]*"-print
find /rtap/rtap/apps/rtap_file/data/ -typef -name "[LTE,master]*" -print
find /rtap/rtap/apps/rtap_file/data/ -typef -name "[LTE,master]*" -exec ls -lrt {} \;
find /rtap/rtap/apps/rtap_file/data/ -typef -name "[LTE,master]*" -exec ls -lrt {} \;|wc -l
find /rtap/rtap/apps/rtap_file/data/ -mtime1 -type f -name "[LTE,master]*" -exec ls -lrt {} \;|wc -l
注:[LTE,master]*表示以LTE和master开头的文件
实例:清理3小时前的文件脚本:
var=`date -d "3 hour ago"+"%Y-%m-%d %H:%M:%S"`
result=`find/rtap/rtap/apps/rtap_file/data/ -mmin +180 -type f -name"[LTE,master]*" -exec ls -lrt {} \;|wc -l`
count=$result
echo "当前目录:/rtap/rtap/apps/rtap_file/data/"
echo "3小时前:"$var"文件列表数:"$result
if [ $count -gt 0 ];then
echo "文件列表如下:"
find/rtap/rtap/apps/rtap_file/data/ -mmin +180 -type f -name"[LTE,master]*" -exec ls -lrt {} \;
else
echo "文件列表为空!"
fi
echo "开始清理昨日文件!"
find /rtap/rtap/apps/rtap_file/data/ -mmin+180 -type f -name "[LTE,master]*" | xargs rm -rf
result=`find/rtap/rtap/apps/rtap_file/data/ -mmin +180 -type f -name"[LTE,master]*" -exec ls -lrt {} \;|wc -l`
if [ $result -lt 10 ];then
echo "清理昨日文件结束!"
exit 0
else
echo "清理昨日文件失败!"
exit 1
fi
8 Shell中使用awk过滤进程
定位包含rtap1关键字进程的pid 和ppid然后执行kill命令杀死进程
ps -ef|grep"rtap1"|grep -v "grep"|awk '{print $2,$3}' |xargs kill-9
定位进程名包含msgPrep关键字的进程并打印出所有进程信息
ps -ef|grep"msgPrep"|grep -v "grep"|grep -v "/bin/bash"|awk'BEGIN {while (getline) print $0}' //按行打印信息
定位包含msgPrep关键字的进程的个数
ps -ef|grep"msgPrep"|grep -v "grep"|grep -v "/bin/bash"|awk'{print $2}'|wc -l