Linux-Unix-Shell实战实例

本文详细介绍了Linux Shell编程中变量判断与操作的关键技巧,包括如何判断变量是否为空、参数打印与拼接、各种比较运算符的使用、整型变量自增方法、ping主机脚本编写、日期比较、删除目录下指定文件的脚本,以及如何使用awk过滤进程。

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 Shellping所有主机的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值