Linux-Unix-Shell实战实例

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux Shell高级技巧实战总结 一、将输入信息转换为大写字符后再进行条件判断 二、为调试信息设置输出级别 三、判断参数是否为数字 四、判断整数变量的奇偶性 五、将Shell命令赋值给指定变量,以保证脚本的移植性 六、获取当前时间距纪元时间(1970年1月1日)所经过的天数 七、非直接引用变量 八、在循环中使用管道的技巧 九、自链接脚本 十、Here文档的使用技巧 十一、获取进程的运行时长(单位: 分钟) 十二、模拟简单的top命令 十三、格式化输出指定用户的当前运行进程 十四、用脚本完成which命令的基本功能 十五、验证输入信息是否合法 十六、整数验证 十七、判断指定的年份是否为闰年 十八、将单列显示转换为多列显示 十九、将文件的输出格式化为指定的宽度 二十、监控指定目录下磁盘使用空间过大的用户 二十一、编写一个更具可读性的df命令输出脚本 二十二、编写一个用于添加新用户的脚本 二十三、kill指定用户或指定终端的用户进程 二十四、判断用户输入(是/否)的便捷方法 二十五、通过FTP下载指定的文件 二十六、文件锁定 二十七、用小文件覆盖整个磁盘 二十八、统计当前系统中不同运行状态的进程数量 二十九、浮点数验证 三十、统计英文文章中每个单词出现的频率 Linux Shell经典实例解析--Oracle启动脚本(上) Linux Shell经典实例解析--Oracle启动脚本(下)
Shell脚本高级编程教程,希望对你有所帮助。 Example 10-23. Using continue N in an actual task: 1 # Albert Reiner gives an example of how to use "continue N": 2 # --------------------------------------------------------- 3 4 # Suppose I have a large number of jobs that need to be run, with 5 #+ any data that is to be treated in files of a given name pattern in a 6 #+ directory. There are several machines that access this directory, and 7 #+ I want to distribute the work over these different boxen. Then I 8 #+ usually nohup something like the following on every box: 9 10 while true 11 do 12 for n in .iso.* 13 do 14 [ "$n" = ".iso.opts" ] && continue 15 beta=${n#.iso.} 16 [ -r .Iso.$beta ] && continue 17 [ -r .lock.$beta ] && sleep 10 && continue 18 lockfile -r0 .lock.$beta || continue 19 echo -n "$beta: " `date` 20 run-isotherm $beta 21 date 22 ls -alF .Iso.$beta 23 [ -r .Iso.$beta ] && rm -f .lock.$beta 24 continue 2 25 done 26 break 27 done 28 29 # The details, in particular the sleep N, are particular to my 30 #+ application, but the general pattern is: 31 32 while true 33 do 34 for job in {pattern} 35 do 36 {job already done or running} && continue 37 {mark job as running, do job, mark job as done} 38 continue 2 39 done 40 break # Or something like `sleep 600' to avoid termination. 41 done 42 43 # This way the script will stop only when there are no more jobs to do 44 #+ (including jobs that were added during runtime). Through the use 45 #+ of appropriate lockfiles it can be run on several machines 46 #+ concurrently without duplication of calculations [which run a couple 47 #+ of hours in my case, so I really want to avoid this]. Also, as search 48 #+ always starts again from the beginning, one can encode priorities in 49 #+ the file names. Of course, one could also do this without `continue 2', 50 #+ but then one would have to actually check whether or not some job 51 #+ was done (so that we should immediately look for the next job) or not 52 #+ (in which case we terminate or sleep for a long time before checking 53 #+ for a new job).

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值