zoukankan      html  css  js  c++  java
  • 2 .SHELL 5~10节

    六. 循环语句for

    语法:

      For 变量 in 字符串
    do
    语句1
    done

    案例一,打印seq数字循环 ,初始值为1,15为结束值

    seq的两边需要用反引号括起来,esc下面那个键。

      
    #!/bin/sh
    for   i   in `seq 1 15`
    do
    echo “NUM is $i”
    done

    案例二,求和1-100的值t

    expr 命令 :用于数字求和,一般用于整数值,但也可用于字符串。

    ​ 注意运算符左右都有空格

      
    #!/bin/sh
    for   i   in `seq 1 15`
    do
    echo “NUM is $i”
    done
      
    #!/bin/bash
    #auto sum 1 100
    j=0
    for ((i=1;i<=100;i++))
    do
          j=`expr $i + $j`
    done
    echo $j

    查看脚本执行的过程

    [test@localhost ~]$ sh -x auto_num.sh

    案例三,找到相关log,然后批量打包

      
    #!bin/sh
    #find /home/test -maxdepth 1 -name "*.sh" 只打印第一级目录,只要后面两行的目录
    for i in `find /home/test -name "*.sh" |tail -2`
    do
      tar -czf 2020log.tgz $i
    done

    解压

      
    #!bin/sh
    for i in `find /home/test -name "*.tgz" |tail -2`
    do
      tar -zxvf $i -C /usr/test/
    done

    案例四,远程主机批量传输文件:

      
    #!/bin/bash
    #auto scp files for client
    #by authors wugk 2014
    for i in `echo 192.168.95.6 192.168.95.4`
    do
          scp -r /home/test/test.txt root@$i:/app
    done

    案例五,远程主机批量执行命令:

    #!/bin/bash

    #auto scp files for client

    #by authors wugk 2014

    for i in `seq 100 200`

    do

    ​ ssh -l root 192.168.95.$i ls /tmp

    done

    七. 循环语句while

      
    while 条件语句
    do
    语句1
    done

    案例一,while条件判断数字

      
    #!/bin/sh
    i=1;
    while [[ $i -lt 10 ]]; # 分号可加可不加
    do
      echo $i;
      ((i++));
    done;

    //或者 (()) 运算
    #!/bin/sh
    i=1;
    while(($i < 10));# 分号可加可不加
    do
      echo $i;
      ((i++));
    done;

    案例二,扩展讲解linux read命令

      
    read -p 'Please Input number:' str
    引用:echo $str
    #或者
    read a
    引用:echo $a

    案例三,while逐行读取某个文件

      
    #!/bin/sh
    while read line
    do
      echo $line;
    done < /home/test/test.txt

    综合脚本编写:

    读取list.txt文件中的每行的第二列为ip ,把test.txt复制到对应的主机/tmp下

    list.txt

      
    #ip read list.txt
    1 192.168.95.12 /src1 /des1
    2 192.168.95.13 /src2 /des2
    3 192.168.95.14 /src3 /des3
    4 192.168.95.15 /src4 /des4
      
    #!/bin/sh
    while read line
    do
    IP=`echo $line |awk '{print $2}'`
      echo -e "33[32mscp -r /home/test/test.txt root@$IP:/tmp 33[0m"
    done < list.txt

    八. Until循环语句

      
    until 条件
    do
    action
    done

    直到满足条件,才退出。否则执行action。

    案例一,条件判断数字 ,满足则退出

      
    #!/bin/sh
    a=10;
    until [[ $a -lt 0 ]];do
    echo $a;
    ((a--));
    done;

    1. Case选择语句

      
    case $arg in  
      pattern1)
      语句1
      ;;  
      pattern2)
      语句2
      ;;  
      *)
      语句3
      ;;  
    esac

    案例一,创建选择参数脚本

      
    #!/bin/sh
    case $1 in
          apache)
          echo -e "33[32m wait install httpd server ..... 33[0m"
          ;;
          mysql)
          echo -e "33[32m wait install mysql server ..... 33[0m"
          ;;
          php)
            echo -e "33[32m wait install php server ..... 33[0m"
          ;;
          *         )
          echo "Usage:{$0 apache | httpd |php }"
          ;;
    esac

    九. select选择语句

    select i in "apache" "mysql" "php";do echo "$i" ;done

    Select一般用于选择菜单的创建,可以配合PS3来做菜单的打印输出信息。

      
    #!/bin/sh
    PS3="What you like most of the open source software?"
    select i in "apache" "mysql" "php"
    do
      case $i in
              apache)
              echo -e "33[32m wait install httpd server ..... 33[0m"
              ;;
              mysql)
              echo -e "33[32m wait install mysql server ..... 33[0m"
              ;;
              php)
                echo -e "33[32m wait install php server ..... 33[0m"
              ;;
              *         )
              echo "Usage:{$0 apache | httpd |php }"
              ;;
      esac
    done

    十. select选择语句

    shell允许将一组命令集或语句形成一个可用块,这些块称为shell函数,定义函数的格式:

    语法如下:

      
    function name (){
          command1
          ........
    }
    name $1 #需要携带的参数

    编写一个Apache安装函数:

      
    #!bin/sh
    #auto install apache
    #by authors kds 20200604
    function Apache_install(){
      echo -e "33[32mThe Apache Server wait install ......33[1m";
    }
    Apache_install #执行函数

    编写一个Apache安装函数:

      
    #!/bin/bash
    #auto install LAMP
    #by wugk 2014-11
    #Httpd define path variable
    H_FILES=httpd-2.2.27.tar.bz2
    H_FILES_DIR=httpd-2.2.27
    H_URL=http://mirrors.cnnic.cn/apache/httpd/
    H_PREFIX=/usr/local/apache2/
    function Apache_install()
    {
    #Install httpd web server
    if [[ "$1" -eq "1" ]];then
    wget -c H_URL/H_FILES && tar -jxvf H_FILES && cd H_FILES_DIR &&./configure --prefix=$H_PREFIX
    if [ $? -eq 0 ];then
    make && make install
    echo -e " 33[32m-----------------------------------------------33[0m"
    echo -e "33[32mThe $H_FILES_DIR Server Install Success !33[0m"
    else
    echo -e "33[32mThe $H_FILES_DIR Make or Make install ERROR,Please Check......"
    exit 0
    fi
    fi
    }
    Apache_install

    Apache_install直接调用函数就会去运行函数里面定义的代码了。

    十一 Shell数组编程

    数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字成为数组名,编号成为下标。

    今天这里我们来探讨一维数组的定义、统计、引用和删除等操作。首先来定义一个一维数组:

    A=( test1 test2 test3 ) ,定义数组一般以括号的方式来定义,数组的值可以随机定义。如何来引用呢?

    echo ${A[0]},代表引用第一个数组变量,结果会显示test1,数组引用从0开始,代表第一个数组,依次类推。

    echo ${A[1]},代表引用第二个数组变量,结果会显示test2,数组引用也是从0开始计算的。

    如何显示该数组所有参数呢?echo ${A[@]} 将显示所有参数test1 test2 test3 。

    如何显示该数组参数个数呢?echo ${#A[@]} 将显示该数组的参数个数3。

    如果替换某个数组呢?例如替换第二个test2数组为test5:echo ${A[@]/test2/test5}

    如何删除一个数组呢?例如删除test3数组命令为:unset A[2] ;

    echo ${A[@]}查看效果。

    案列1:

    创建一个数组,

    展示参数的数量

    更具输入的下标打印数组元素

      
    #!/bin/bash
    soft=(
    nginx-1.6.1.tar
    mysql-5.1.17.tar
    php-1.3.3.tar
    /etc/sysctl.conf
    )
    echo "This soft total number ${#soft[@]}"
    echo ${soft[$1]}
    案列2:那输入如何在编程来使用呢?请看下面例子:

    #!/bin/sh

    #Auto Make KVM Virtualization

    #Auto config bond scripts

    eth_bond()

    {

    NETWORK=(

    HWADDR=ifconfig eth0 |egrep "HWaddr|Bcast" |tr " " " "|awk '{print $5,$7,$NF}'|sed -e 's/addr://g' -e 's/Mask://g'|awk '{print $1}'

    IPADDR=ifconfig eth0 |egrep "HWaddr|Bcast" |tr " " " "|awk '{print $5,$7,$NF}'|sed -e 's/addr://g' -e 's/Mask://g'|awk '{print $2}'

    NETMASK=ifconfig eth0 |egrep "HWaddr|Bcast" |tr " " " "|awk '{print $5,$7,$NF}'|sed -e 's/addr://g' -e 's/Mask://g'|awk '{print $3}'

    GATEWAY=route -n|grep "UG"|awk '{print $2}'

    )

    cat >ifcfg-bond0<<EOF

    DEVICE=bond0

    BOOTPROTO=static

    ${NETWORK[1]}

    ${NETWORK[2]}

    ${NETWORK[3]}

    ONBOOT=yes

    TYPE=Ethernet

    NM_CONTROLLED=no

    EOF

    如上脚本为定义三个数组变量,然后分别来引用,这样让脚本可读性更强,更整洁。关于数组就简单的介绍到这里。

  • 相关阅读:
    【转载】Linux的进程间通信-信号量
    【转载】高性能数据库连接池的内幕
    【转载】我是一块硬盘(下)
    【转载】我是一块硬盘(上)
    69. Sqrt(x)
    68. Text Justification
    67. Add Binary
    66. Plus One
    65. Valid Number
    64. Minimum Path Sum
  • 原文地址:https://www.cnblogs.com/KdeS/p/13083746.html
Copyright © 2011-2022 走看看