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

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

原文地址:https://www.cnblogs.com/KdeS/p/13083746.html