shell脚本入门详解及其实例-演道网

本网站用的阿里云ECS,推荐大家用。自己搞个学习研究也不错

<

div contentScore=”2427″>

2.5.2 循环控制命令shift

  位置参数可以用shift命令左移,比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1,$2,$3丢弃,$0不移动。不带参数的shift命令相当于shift 1。

  我们知道,对于位置变量或命令行参数,其个数必须是确定的,或者当shell程序不知道其个数时可以把所有参数一起赋值给变量$*。当用户要求shell在不知道位置变量个数的情况下,还能逐个的把参数一一进行处理,也就是在$1后为$2等。在shift命令执行前变量$1的值在shift命令执行后就不可用了。

Example:

1)测试shift命令

1 #!/bin/bash
2 until [ $# -eq 0 ];do
3     echo "The first argument is:$1,The number of arguments is:$#"
4     shift
5 done

2.5.3 信号捕捉trap

  trap是一个shell内建命令,它用来在脚本中指定信号如何处理。比如,按Ctrl+C会使脚本终止执行,实际上系统发送了SIGINT信号给脚本进程,SIGINT信号的默认处理方式就是退出程序。如果要在Ctrl+C不退出程序,那么就得使用trap命令来指定一下SIGINT的处理方式了。trap命令不仅仅处理Linux信号,还能对脚本退出(EXIT)、调试(DEBUG)、错误(ERR)、返回(RETURN)等情况指定处理方式。

  基本格式语法如下:

  •   trap ‘触发指令’ 信号

  自定义进程收到系统发出的指定信号后,将执行触发指令,而不是执行原操作

  •       trap ‘’ 信号

  忽略信号的操作

  •   trap ‘-’ 信号

  恢复原信号的操作

  •       trap -p

  列出自定义信号的操作,即提示当前使用的trap操作是什么。

注意:①信号的表示方法:可以是完整信号/简写/数字(具体内容通过kill -l查询)

②信号9,强制杀死,捕获不到。

Example:

1)打印0-9,ctrl+c终止无效

 
1 #!/bin/bash
2 #设置信号捕获
3 trap 'echo press ctrl+c' 2
4 for ((i=0;i<10;i++));do
5     sleep 1
6     echo $i
7 done

2)打印0-9,3之前ctrl+c不能终止,3之后恢复,能终止

 
 1 #!/bin/bash
 2 #设置信号捕获
 3 trap '' 2
 4 trap -p
 5 for ((i=0;i<3;i++));do
 6     sleep 1
 7     echo $i
 8 done
 9 trap '-' SIGINT
10 for ((i=3;i<10;i++));do
11     sleep 1
12     echo $i
13 done
 


2.5.4 创建无限循环

  在我们的shell脚本中,可以创建一个死循环,具体设置如下:

  while true;do

    循环体

  done

 

2.5.5 在循环语句中执行并行命令

  当我们需要在脚本里执行一条命令很多次的时候,我们可以将其设置为并行执行,这样可以极大的提升脚本运行速度,但是也有缺点,并行执行的话,相当于开了很多子shell一起执行,运行速度上来了,但是对资源的消耗也增多了

  具体的用法示例如下:

  for name in 列表; do

    {

        循环体

}$

  done

  wait

Example:

1)搜寻自己指定的的IP(子网掩码为24的)的网段中,up的ip地址

 
 1 #!/bin/bash
 2 #定义变量
 3 read -p "Please input network (eg:172.17.0.1): " net echo $net |egrep -o "\<(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
 4 #判断网段是否符合规范
 5 [ $? -eq 0 ] || ( echo "input error";exit 10 )
 6 #判断网段内哪些IP能ping通,并行执行
 7 IP=`echo $net |egrep -o "^([0-9]{1,3}\.){3}"`
 8 for i in {1..254};do
 9      {   
10          ping -c 1 -w 1 $IP$i &> /dev/null && \
11          echo "$IP$i is up" 
12      }&  
13 done
14 wait
15  
16 #删除变量
17 unset net IP i

 

三、小补充

      介绍了这么多语法,我们来玩一些好玩的吧~下面是小编给大家分享的几个有意思的脚本

1)打印等腰三角形(带闪烁)

 
 1 #!/bin/bash
 2 #num=总行号  i=第几行  j=*个数  k=空格个数
 3 read -p "请输入一个数字:" num 
 4 for i in `seq 1 $num`;do
 5     for k in `seq 1 $[$num-$i]`; do
 6         echo -n " "
 7     done
 8     for j in `seq 1 $[2*$i-1]`;do
 9         if [ $j -eq 1 ] || [ $j -eq $[2*$i-1] ] || [ $i -eq $num ];then
10             color=$[RANDOM%5+31]
11             echo -en "\033[1;$color;5m*\033[0m"
12         else
13             echo -n "*"
14         fi  
15     done
16     echo
17 done
18 
19 #删除变量
20 unset num i j k color
具体的效果大家可以自己去尝试,就是下面两张图配合出来的效果:

2)打印国际象棋棋盘

 
 1 #!/bin/bash
2 #定义变量
3 color_1="\033[1;44m \033[0m"
4 color_2="\033[1;45m \033[0m"
5 for (( i=1;$i <=8;i++ ));do 6 for (( j=1;$j <=8;j++ ));do 7 if [ $[$i%2] == 1 ] && [ $[$j%2] == 1 ];then 8 echo -en "$color_1$color_2" 9 elif [ $[$i%2] == 0 ] && [ $[$j%2] == 0 ];then 10 echo -en "$color_2$color_1" 11 fi

转载自演道,想查看更及时的互联网产品技术热点文章请点击http://go2live.cn

未经允许不得转载:演道网 » shell脚本入门详解及其实例-演道网

赞 (0)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册