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 "\033[32mscp -r /home/test/test.txt root@$IP:/tmp \033[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 "\033[32m wait install httpd server ..... \033[0m"
;;
mysql)
echo -e "\033[32m wait install mysql server ..... \033[0m"
;;
php)
echo -e "\033[32m wait install php server ..... \033[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 "\033[32m wait install httpd server ..... \033[0m"
;;
mysql)
echo -e "\033[32m wait install mysql server ..... \033[0m"
;;
php)
echo -e "\033[32m wait install php server ..... \033[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 "\033[32mThe Apache Server wait install ......\033[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 "\n\033[32m-----------------------------------------------\033[0m"
echo -e "\033[32mThe $H_FILES_DIR Server Install Success !\033[0m"
else
echo -e "\033[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 "\n" " "|awk '{print $5,$7,$NF}'|sed -e 's/addr://g' -e 's/Mask://g'|awk '{print $1}'
IPADDR=ifconfig eth0 |egrep "HWaddr|Bcast" |tr "\n" " "|awk '{print $5,$7,$NF}'|sed -e 's/addr://g' -e 's/Mask://g'|awk '{print $2}'
NETMASK=ifconfig eth0 |egrep "HWaddr|Bcast" |tr "\n" " "|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
如上脚本为定义三个数组变量,然后分别来引用,这样让脚本可读性更强,更整洁。关于数组就简单的介绍到这里。