shell之脚本片断

14.删除程序产生的日志,只保留一个当天日期的文件,并且在每天20点时清空此文件,感觉有点重复,要么只保留一个文件,要么清空都可以达到减少占用磁盘的目的。

[Thu Mar 26 10:01:40 1071 /dev/pts/1 192.168.2.109 /usr/local/ps/log]#cat /var/prtg/scripts/pslog

#find /usr/local/ps/log  -ctime +0|xargs rm -rf

#>/usr/local/ps/log/debug*

a=debug`date +%Y%m%d`.log

for i in `ls *.log`

do

if [ "$i" != "$a" ]

 then

 rm -rf $i

 else

 >$i

fi

done

 

13.

黑白棋盘
其实是个双循环,
外层执行第一层循环时
内层共执行8次,并判断是单或双,
是单的话,total是双,tmp余数是0,输出背景为灰的两个空格
是双的话,total是单,tmp余数是1,输出背景为黑的两个空格
外层第一层最后一个echo ""是换行
然后执行第二层外循环
[Wed Mar 25|15:40:23 ~ 1081 /bin/bash ]# cat black #!/bin/bash for((i=1;i<=8;i++)) do for((j=1;j<=8;j++)) do total=$(($i+$j)) tmp=$(($total%2)) if [ $tmp -eq 0 ] then echo -e -n "\033[47m \033[0m" else echo -e -n "\033[40m \033[0m" fi done echo "" done

[Wed Mar 25|15:40:46 ~ 1082 /bin/bash ]# cat .bashrc # .bashrc # User specific aliases and functions alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi #PS1='[\u@\h \W]\$ ' export PS1='[\d|\t \w \! $SHELL ]\$ '

 

12.

因为有好多的safe进程,所以把每一个列出来并杀死

[root@aster3 ~]# cat a

a=`ps -ef|grep safe|grep -v grep|awk '{print $2}'`

for i in $a

 do

 kill -9 $i

 done



清空每一个日志文件

[root@84-monitor monitorlog]# cat a

for i in `ls *.log`

do

#echo $i

> $i

done

 

11.

日常工作中,处理数据难免会遇到遍历,for循环可能是我们用的比较多的了。本节就来探讨下for语句嵌套循环的性能,猜想下面两个语句的性能。

外层循环越少效率越高

[root@250-shiyan sh]# cat inlinefor

for (( i=1; i<100; i++ ))

do

 for (( c=1; c<1000; c++ ))

  do

  echo "$c-----inline"

  done

echo "$i-----outline"

done

[root@250-shiyan sh]# cat outlinefor

for (( i=1; i<1000; i++ ))

do

 for (( c=1; c<100; c++ ))

  do

  echo "$c-----inline"

  done

echo "$i-----outline"

done

[root@250-shiyan sh]# time (bash inlinefor) |tail -3

998-----inline

999-----inline

99-----outline



real    0m1.754s

user    0m1.433s

sys     0m0.319s

[root@250-shiyan sh]# time (bash outlinefor) |tail -3

98-----inline

99-----inline

999-----outline



real    0m1.731s

user    0m1.392s

sys     0m0.338s



[root@250-shiyan sh]# time (bash inlinefor) |tail -3

9998-----inline

9999-----inline

999-----outline



real    3m8.818s

user    2m25.615s

sys     0m43.021s

[root@250-shiyan sh]# time (bash outlinefor) |tail -3

998-----inline

999-----inline

9999-----outline



real    3m5.233s

user    2m21.791s

sys     0m43.278s

 

10.脚本执行方式及子进程关系

###4种方式:全路径/path/to/conns|bash conns|source conns|. conns
###要有执行权限产生子shell
[root@250-shiyan prog]# cat conns #!/bin/bash ip_conns=`ssh $1 "netstat -ant| grep EST | wc -l"` echo $ip_conns [root@250-shiyan prog]# chmod u+x conns [root@250-shiyan prog]# cp conns /usr/bin [root@250-shiyan prog]# conns 192.168.2.109
[root@250-shiyan prog]# ./conns
[email protected]'s password:
851
###无需执行权限,产生子shell
[root@250-shiyan prog]# bash conns
[email protected]'s password:
855
[root@84-monitor ~]# cat a
a=192.168.2.109
ip_conns=`ssh $a "netstat -ant| grep EST | wc -l"`
echo $ip_conns
###source命令与点命令是在当前shell中执行,并不产生子shell,也不需要脚本有执行权限。
[root@84-monitor ~]# source a
860
[root@84-monitor ~]# . a
860

 

9.

shell 判断字符串中是否含有指定字符

new=sdd

ps=s

echo "$new" |grep -q "$ps"

if [ $? -eq 0 ]

then

echo "yes"

else

echo "no"

fi

 

判断某年某天是星期几?

year=1980

end_year=2010

day_2=10/22

week_2=Fri

 

while [ $year -lt $end_year ]

do

new=`date -d "$day_2 CST $year"`

echo "$new"

echo "$new" |grep -q "$week_2"

if [ $? -eq 0 ]

then      

      #  year=`expr $year + 1`

echo "this year $year include $week_2"

    year=`expr $year + 1`

else

    #echo "this year $year include $week_2"

    year=`expr $year + 1`

fi  

done

[root@250-shiyan prog]# expr length "$HOME"
5
[root@250-shiyan prog]# echo "$HOME"|wc -c
6
[root@250-shiyan prog]# echo “$HOME”|awk '{print length($0)}'
7
判断字符串为空的方法有三种:
if [ "$str" = "" ] if [ x"$str" = x ] if [ -z "$str" ] (-n 为非空) 注意:都要用双引号,否则有些命令会报错,养成好习惯吧!

 

8.

[root@250-shiyan frag]# bash here.sh

USAGE: xtitlebar [-h] "string_for_titelbar"

OPTIONS: -h help text

EXAMPLE: xtitlebar "cvs"

[root@250-shiyan frag]# cat here.sh

help()

{

cat <<HELP

USAGE: xtitlebar [-h] "string_for_titelbar"

OPTIONS: -h help text

EXAMPLE: xtitlebar "cvs"

HELP

exit 0

}

help

 

7.还有点问题,2015/5/25的时候才搞明白下面的问题所在。才理解了下面的这段脚本含义。

[root@250-shiyan frag]# bash while2.sh

enter y/n :

y

===============================================

| unix script test |

| 1 --- num 1 |

| 2 --- num 2 |

| 3 --- num 3 |

| 4 --- num 4 |

===============================================

enter y/n :

n

Press <return> to proceed or type q to quit:

ef

Press <return> to proceed or type q to quit:

ef

Press <return> to proceed or type q to quit:

q

[root@250-shiyan frag]# cat while2.sh

#!/bin/bash

banner()

{

cat <<echo1

===============================================

| unix script test |

| 1 --- num 1 |

| 2 --- num 2 |

| 3 --- num 3 |

| 4 --- num 4 |

===============================================

echo1

}



getyn()

{

while echo "enter y/n :"

do

read yn

case $yn in

[Yy]) return 0 ;;

yes) return 0 ;;

YES) return 0 ;;

[Nn]) return 1 ;;

no) return 1;;

NO) return 1;;

* ) echo "only accept Y,y,N,n,YES,yes,NO,no";;

esac

done

}



pause()

{

while echo "Press <return> to proceed or type q to quit:"

do

read cmd

case $cmd in

####break跳出while语句

[qQ]) exit 1;;

####引号中间没有任何字符,表示是return

"") break;;

####continue继续下一循环

*) continue;;

esac

done

}



####pause or getyn to test

while getyn    

do

banner

done

pause

 

6.

[root@250-shiyan frag]# bash while.sh

input num:

4

input is 4

new num is 5

new num is 6

new num is 7

new num is 8

new num is 9

new num is 10

[root@250-shiyan frag]# cat while.sh

#!/bin/bash

echo "input num:"

read num

echo "input is $num"

while test $num -lt 10

do

num=$(($num+1))

echo "new num is $num"

sleep 2

done

 

5.

[root@localhost script]# cat >if-1

#!/bin/bash

echo -e "are you ok(y/n or maybe)? \c"

read answer

if [[ $answer == [yY]* || $answer = maybe ]]

then echo "glad to hear it"

fi

[root@localhost script]# bash if-1

are you ok(y/n or maybe)? dk

[root@localhost script]# bash if-1

are you ok(y/n or maybe)? y

glad to hear it

[root@localhost script]# bash if-1

are you ok(y/n or maybe)? Y

glad to hear it

[root@localhost script]# bash if-1

are you ok(y/n or maybe)? maybe

glad to hear it

 

4.||表示只要其中之一个,满足即可,&&表示两个,以至n个条件都要满足才可以。

####也可以一试
if [[ "$s" -gt "0" ||  "$r" -gt "0" ]]

[root@localhost script]# cat >if-2 #!/bin/bash echo -e "how old are you? \c" read age if (( age < 0 || age > 120 )) then echo "you are so old" ####两个同时满足,即上限与下限 elif (( age >=0 && age <= 12 )) then echo "you are child" elif (( age >=13 && age <=19 )) then echo "you are 13-19 years old" elif (( age >=20 && age <=29 )) then echo "you are 20-29 years old" elif (( age >=30 && age <=39 )) then echo "you are 30-39 years old" else echo "you are above 40" fi [root@localhost script]# bash if-2 how old are you? 30 you are 30-39 years old [root@localhost script]# bash if-2 how old are you? 28 you are 20-29 years old [root@localhost script]# bash if-2 how old are you? 400 you are so old [root@localhost script]# bash if-2 how old are you? 0 you are child

 

3.检查根分区,循环做两件事,a.输出当前值,b.如果大于10%,则输出信息

[root@250-shiyan sh]# cat check-root.sh

#!/bin/bash

while sleep 5

  do

    for i in `df -h |sed -n '/\/$/p'|awk '{print $5}'|sed 's/\%//g'`

         do echo $i

         if [ $i -ge 10 ]

         then

         echo " more than 10$ linux of disk space."

         fi

         done

  done



[root@250-shiyan sh]# bash check-root.sh

11

 more than 10$ linux of disk space.

11

 more than 10$ linux of disk space.

 

2.自编有while循环,有函数,有if,还有脚本参数,执行时  ./while w1或./while w2

[root@250-shiyan sh]# cat while

#!/bin/bash

w1 () {

min=1

max=100

while [ $min -le $max ]

do

echo $min

min=`expr $min + 1`

done

}



w2 () {

i=1

while(($i<100))

do

if(($i%4==0))

then

echo $i

fi

i=$(($i+1))

done

}



if [ $@ = w1 ]

then

w1

else

w2

fi

 

1.自编让其以后台进程形式存在,不用crontab去定期执行

[root@250-shiyan sh]# cat eth

#!/bin/bash

while [ 1 -gt 0 ]

do

eth=`ifconfig eth0|grep "TX bytes"|gawk '{print $6}'|cut -d ":" -f2`

echo $eth >> /root/sh/jj

sleep 2

done



[root@250-shiyan sh]# bash eth &

[root@250-shiyan sh]# tail -f jj

 

你可能感兴趣的:(shell)