shell基础之03(初阶实战)

  • read

每次调用读取文件中的“一行”,当文件没有可读时,read命令将以非零状态退出。
 读取文件的关键是如何将文本的数据传送给read命令。
最常用的方法是对文件使用cat命令并通过管道将结果直接传送给包含read命令的while命令

#!/bin/bash
count=1 
cat text.sh| while read line  --------cat命令的输出作为read命令的输入,read读到的值放在line中

do
 echo "Line $count:$line"
 count=$[ $count+1 ] 
done
echo "finish"
exit 0
      

echo 显示信息
 echo 回车后会空一行
 echo -n
[root@localhost ~]# echo

[root@localhost ~]# echo -n--------- -n 不输出行尾的换行符,不会出现空行
[root@localhost ~]#


 #!/bin/bash
for i in 1 2 a b c  -----  【i在这里是个变量】【变量的值可以被覆盖】
do
  echo $i  ----------   【读取结果】
done

for i in a tt yy uu 22 33    -----------【这里的i只是表示反复读取的次数】
do
  echo abc
done

 

[root@localhost ~]# echo {1..20}   【产生8个数字】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

[root@room9pc01 ~]# echo [a,b,c]-------------注意不要用成方括号
[a,b,c]

[root@localhost ~]#

[root@localhost ~]# seq 5  -----------生成1---5
1
2
3
4
5
[root@localhost ~]# seq 2 5----生成2---5
2
3
4
5
[root@localhost ~]# seq 2 5 20------生成以2开始递增值为5,直到20的所有值
2
7
12
17
[root@localhost ~]#


#!/bin/bash
for i in {1..1000}  --------【注意:{}没有空格】
do
    touch /tmp/$i.txt &  ----------【&速度会提高】
done

#!/bin/bash
for i in `seq 1000`
do     
  rm -rf /tmp/$i.txt &
done


写脚本,将/var/log/目录下,每个文件或目录,单独打包
ls /var/log

/var/log/a---->/var/log/a.tar.gz
/var/log/b---->/var/log/b.tar.gz
/var/log/c---->/var/log/c.tar.gz

tar -czf 打包后的文件名  打包对象
-c (create)
-z (gzip)
-f (file)

./test11.sh
#!/bin/bash
for i in `ls /var/log/`   【ls取出的东西是没有路径的】
do
  tar -czf /var/log/$i.tar.gz /var/log/$i &> /dev/null 【压缩是要给路径的!!从哪来,到哪去!】 重点:&> /dev/null
done
+++++一定要给绝对路径,否则会读取当前路径++++++

for 变量 in 值1 值2 值3 ...
do
    命令
done

for ((i=1;i<=5;i++))
do
  echo abc
done

练习:(打印9*9乘法表) 需要两个for

vim 1.sh

#!/bin/bash
for i in `seq 9`
do
for j in `seq $i`
do
echo -n "$j*$i=$[j*i]" && echo -n  " " && [ $j -eq $i ] && echo----------------echo -n可以做到不换行,echo则会换行
done
done



[root@room8pc205 ~]# ./1.sh |column -t-------column -t自动对齐
1*1=1
1*2=2  2*2=4
1*3=3  2*3=6   3*3=9
1*4=4  2*4=8   3*4=12  4*4=16
1*5=5  2*5=10  3*5=15  4*5=20  5*5=25
1*6=6  2*6=12  3*6=18  4*6=24  5*6=30  6*6=36
1*7=7  2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49
1*8=8  2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64
1*9=9  2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81

或者

[root@room9pc01 ~]# for i in `seq 9`; do for j in `seq $i`; do echo -n "$i*$j=$[i*j]" && echo -n " " ; done; echo; done | column -t
1*1=1
2*1=2  2*2=4
3*1=3  3*2=6   3*3=9
4*1=4  4*2=8   4*3=12  4*4=16
5*1=5  5*2=10  5*3=15  5*4=20  5*5=25
6*1=6  6*2=12  6*3=18  6*4=24  6*5=30  6*6=36
7*1=7  7*2=14  7*3=21  7*4=28  7*5=35  7*6=42  7*7=49
8*1=8  8*2=16  8*3=24  8*4=32  8*5=40  8*6=48  8*7=56  8*8=64
9*1=9  9*2=18  9*3=27  9*4=36  9*5=45  9*6=54  9*7=63  9*8=72  9*9=81
     


echo -e "\033[31mOK\033[Om"
echo -e【扩展】 "\033【 颜色】[31【shai】mOK【内容】\033【颜色】[Om【色到哪里】"
 extend   所有内容是红色\这个之间是红色

while 测试
do
  命令
done

当测试为真时,执行命令,直到测试为错时,循环结束

i=1
while [ $i -le 5 ]                    
do
  echo abc
  let i++   //循环5次
done
 

#!/bin/bash ---------------死循环
i=1
while [ $i -le 5 ]
do
      echo $i
done


定义死循环
while :   ----------------【不固定次数】
do

done

while true
do

done

 

ping网段

  1. for i in {1..254}
  2. do
  3.  ping -c 2 192.168.4.$i &> /dev/null
  4.     if [ $? -eq 0 ];
  5.      then
  6.      echo "192.168.4.$i is up"
  7. let x++
  8.      else
  9.       echo "192.168.4.$i is down"
  10.     fi
  11. done
  12. echo $x

+++++++++++++++++++++++++++++++++++++++++++++++++
国际象棋棋盘

  1. #!/bin/bash
  2. for i in {1..8}
  3. do
  4.         for j in {1..8}
  5.         do
  6.                 if [ $[(i+j)%2] -eq 0 ] ; then
  7.                         echo -en "\033[41m \033[0m"
  8.                 else
  9.                         echo -en "\033[47m \033[0m"
  10.                 fi
  11.         done
  12.         echo
  13. done


###批量创建用户###

  1. 版本1
  2. for i in {1..100}
  3. do
  4.  useradd user$1
  5. done

版本2

  1. useradd $1
  2. echo "$2" | passwd --stdin $1

 

  1. for i in `cat user.txt`
  2. do
  3.  useradd $i
  4.  echo "123456" | passwd --stdin $i
  5. done

 

 

  1. #!/bin/bash
  2. for i in {1..254}
  3.  do
  4.         ping -c 3 172.40.3.$i $>/dev/null
  5.    if [ $? -eq 0 ];
  6.         then
  7.          ssh 172.40.3.$i shutdown    //需要免密
  8.         else
  9.       echo "172.40.3.$i is down"
  10.    fi
  11.  done           


 

当用户输入redhat,返回fedora
当用户输入fedora,返回redhat
其他,返回Usage:xxx

在 system1 上创建一个名为/root/foo.sh 的脚本,让其提供下列特性:
当运行/root/foo.sh redhat,输出为 fedora
当运行/root/foo.sh fedora,输出为 redhat
当没有任何参数或者参数不是 redhat 或者 fedora 时,其错误输出产生以下的信息:
/root/foo.sh redhat|fedora

[root@serverX ~]# vim /root/foo.sh

  1. #!/bin/bash
  2. if [ $# -eq 0 ]
  3. then
  4. echo "/root/foo.sh redhat|fedora" >&2
  5. elif [ "$1" = "redhat" ]
  6. then
  7. echo "fedora"
  8. elif [ "$1" = "fedora" ]
  9. then
  10. echo "redhat"
  11. else
  12. echo "/root/foo.sh redhat|fedora" >&2
  13. fi

[root@serverX ~]# chmod +x /root/foo.sh
或者
[root@serverX ~]# vim /root/foo.sh

  1. #!/bin/bash
  2. case "$1" in
  3. redhat)
  4. echo "fedora";;
  5. fedora)
  6. echo "redhat";;
  7. *)
  8. echo '/root/foo.sh redhat|fedora' >&2;;
  9. esac
  10. [root@serverX ~]# chmod +x /root/foo.sh
  11. case 简化版的if(功能比if少)

语法格式

case 变量 in -------判断变量与值1是否相等
值1)
   命令
   命令;;
值2)-----------判断变量与值2是否相等
   命令;;
*) -----------------相当于if语句中的else     
   命令;;
esac

#!/bin/bash

  1. case $1 in
  2.  redhat)
  3.         echo "fedora";;
  4.  fedora)
  5.         echo "redhat";;
  6. *)
  7.         echo "usage:xxx";;
  8. esac

 

 

  1. read -p "请输入点嘛:" key
  2. case $key in
  3. [a-Z])------------Z  a-Z 的大小写都可以识别【逻辑上的或者】 还可以写成[a-z]|[A-Z])
  4.     echo "字母";;
  5. [0-9])
  6.     echo "数字";;
  7. *)
  8.     echo "符号";;
  9. esac

+++++++++++++++++++++++++++++++++++++++++++++++
快速将vim中的所有都注释掉:ECS,Ctrl+v,下键,I,#,ESC
u  在vim编辑器里,可以撤销上一条命令


[0-9][0-9]   表示两位数

 

 


函数(避免代码的重复)

 

yum install    httpd
systemctl start httpd
systemctl enable httpd

语法:
1.定义函数
    函数名(){
       命令
       命令
       命令
    }

2.调用函数:
    函数名

[root@localhost ~]# mymkdir () {
> mkdir $1
> cd $1
> ls -lh $1
> }
[root@localhost ~]# mymkdir /a
总用量 0
[root@localhost a]# mymkdir /b
总用量 0
[root@localhost b]# mymkdir /hehe
总用量 0
[root@localhost hehe]#

##写到profile里才是永久的。
install () {
yum -y install $1
systemctl start $1
systemctl enable $1
}

调用函数:

install httpd
install vsftpd
install mariadb-server

#!/bin/bash
cecho () {
echo -e "\033[$1m$2 \033[0m"
}
cecho 32 OK
cecho 32 OK
cecho 32 OK

+++++++++++++++++++++++++++++++++++++++++++

函数名称(){
    命令
    命令
    命令
}


vim test.sh    //死机.死得很彻底
#!/bin/bash
.(){   //定义函数名称为.
.|.&  //调用自己管道给自己,后台运行【核心问题在&上】
}
.   //自己执行
---------------------------------------------------------------------------

vim test.sh
num=`who |wc -l`
[ $num -gt 3 ] && mail xxx

crontab -e
* * * * *  /root/test.sh

vim test.sh
while:
do
 echo a
 echo b
done

结果:while死循环,不会结束。每分钟都会执行

可以:
vim a.sh
while:
do
  text.sh
done
-------------------------------------------------------------------------------------

脚本的中断

假设i=x
for i in {1..254}
do
 ssh 192.168.4.$i shutdown++

 

done
结果:##自己是谁## 同一个网段的才可以ssh,如果自己是10,就把自己关掉了
       脚本的目的是什么

continue:结束本次循环,进入下一次循环。不关心是for还是while。
break:结束整个循环体
exit:结束脚本

eg:
for i in {1..5}
do
    echo $i
    continue   //1结束直接跳到2循环....
    echo a
done

for i in {1..5}
do
    echo $i
    break   //整个循环结束...
done
echo over
1 over

for i in {1..5}
do
    [ $i -eq 3 ] && [continiu|break|exit]
                            只有3不执行|只有1.2|1,2,然后直接退出脚本
    echo $i
done
echo over

[root@localhost test]# vim duan.sh
[root@localhost test]# . duan.sh   //continue

1

2

4

5

echo over

[root@localhost test]# vim duan.sh
[root@localhost test]# . duan.sh   //break

1

2

echo over

[root@localhost test]# vim duan.sh
[root@localhost test]# . duan.sh    //exit
1
2
 

  1. vim qiuhe.sh
  2. #!/bin/bash
  3. sum=0
  4. while :
  5. do
  6.     read -p "请输入整数:" num
  7.     [ $num -eq 0 ] && break
  8.     sum=$[sum+num]
  9. done
  10. echo $sum

-----------------------------------------------------------------------------------------------------------------

跳过1~20以内非6的倍数,输出其他数的平方值,设定退出代码为2
for i  in {1..20}
do
    x=$[i%6]
        [ $x -ne 0 ] && continue
    echo $[i*i]
done
---------------------------------------------------------------------------------------------------------------------------

1-10输出3,6,9 的平方数(3的倍数)

在红帽6中可以安装bash-completion====》》》》Tab+++++++++++++++++++++++++++++++++++++++++++++++++++

 

 


 

 


     

 


 

    [root@svr5 ~]# vim /etc/init.d/myhttpd

  1.     #!/bin/bash
  2.     # chkconfig: 2345 90 10

        *)                                              //默认输出脚本用法
            echo "用法: $0 {start|stop|status|restart}"
            exit 1
        esac
        [root@svr5 ~]# chmod +x /etc/init.d/myhttpd
  3.     # description: Startup script for http Server. (for Test only)
  4.     #!/bin/bash
  5.     case $1 in
  6.     start)
  7.             /usr/sbin/httpd
  8.             echo "我已经启动了";;
  9.     stop)
  10.             kill `cat /var/run/httpd/httpd.pid`;;   #反引号
  11.     restart)
  12.             kill `cat /var/run/httpd/httpd.pid`
  13.             sleep 1
  14.             /usr/sbin/httpd;;
  15.     status)
  16.             if [ -f /var/run/httpd/httpd.pid ];then
  17.                 echo "服务正在运行..."
  18.             else
  19.                 echo "服务已经关闭"
  20.             fi;;
  21.     esac

 

  1.     [root@svr5 ~]# vim funexpr.sh
  2.     #!/bin/bash
  3.     myexpr() {
  4.         echo "$1 + $2 = $[$1+$2]"
  5.         echo "$1 - $2 = $[$1-$2]"
  6.         echo "$1 * $2 = $[$1*$2]"
  7.         echo "$1 / $2 = $[$1/$2]"
  8.     }
  9.     myexpr $1 $2
  10.     [root@svr5 ~]# chmod +x funexpr.sh
  11. 3)测试脚本执行效果
  12.     [root@svr5 ~]# ./funexpr.sh  43  21
  13.     43 + 21 = 64
  14.     43 - 21 = 22
  15.     43 * 21 = 903
  16.     43 / 21 = 2
  17.     [root@svr5 ~]# ./funexpr.sh 1234 567
  18.     1234 + 567 = 1801
  19.     1234 - 567 = 667
  20.     1234 * 567 = 699678
  21.     1234 / 567 = 2

 

 

  1.     [root@svr5 ~]# vim sum.sh
  2.     #!/bin/bash
  3.     while  read  -p  "请输入待累加的整数(0表示结束):"     x
  4.     do
  5.         [ $x -eq 0 ]  &&  break
  6.         SUM=$[SUM+x]
  7.     done
  8.     echo "总和是:$SUM"

 

 

  1. 1)编写脚本文件
  2.     [root@svr5 ~]# vim mysum.sh
  3.     #!/bin/bash
  4.     i=0
  5.     while  [ $i -le 20 ]
  6.     do
  7.         let i++
  8.         [ $[i%6] -ne 0 ]  &&  continue
  9.         echo $[i*i]
  10.     done
  11.     exit 2

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值