shell(二)

1、case语句

  1. [root@localhost day1121]# cat test1.sh
    #!/bin/bash
    case $1 in 
    "1")
        echo "您输入的是1"
    ;;
    "2")
        echo "您输入的是2"
    ;;
    *)
        echo "您输入的是其他"
    ;;
    esac
    [root@localhost day1121]# bash test1.sh
    您输入的是其他
    [root@localhost day1121]# bash test1.sh 1
    您输入的是1
    [root@localhost day1121]#
  2. 案例: 判断⽤户输⼊的字符类型使⽤case,字母类型[a-z][A-Z] 数字类型[0-9] 其他
    [root@localhost day1121]# cat test2.sh
    #!/bin/bash
    read -p "请输入任意一个字符" ch
    case $ch in
    [A-Z] | [a-z])
        echo "字母"
    ;;
    [0-9])
        echo "数字"
    ;;
    *)
        echo "其他"
    ;;
    esac
    [root@localhost day1121]# bash test2.sh
    请输入任意一个字符a
    字母
    [root@localhost day1121]# bash test2.sh
    请输入任意一个字符1
    数字
    [root@localhost day1121]# bash test2.sh
    请输入任意一个字符/
    其他
    [root@localhost day1121]#

2、循环语句

  1. for 变量 in 空格分隔的数据列表;do 语句块 done
    [root@localhost day1121]# cat test3.sh
    #!/bin/bash
    for i in 1 2 3 4 5
    do
        echo $i
    done
    [root@localhost day1121]# bash test3.sh
    1
    2
    3
    4
    5
    [root@localhost day1121]# cat test4.sh
    #!/bin/bash
    for i in $*
    do
        echo $i
    done
    [root@localhost day1121]# bash test4.sh
    [root@localhost day1121]# bash test4.sh
    [root@localhost day1121]# bash test4.sh aa bb cc
    aa
    bb
    cc
    [root@localhost day1121]# 
  2. for 变量 in {起始值..终⽌值..步进值};do 语句块 done
    [root@localhost day1121]# cat test5.sh
    #!/bin/bash
    for i in {1..5..1}
    do
        echo $i
    done
    [root@localhost day1121]# bash test5.sh
    1
    2
    3
    4
    5
    [root@localhost day1121]# cat test6.sh
    #!/bin/bash
    for i in {101..105..1}
    do
        echo hadop$i
    done
    
    [root@localhost day1121]# bash test6.sh
    hadop101
    hadop102
    hadop103
    hadop104
    hadop105
    [root@localhost day1121]# cat test7.sh
    #!/bin/bash
    for i in hadop{101..105}
    do
        echo $i
    done
    
    [root@localhost day1121]# bash test7.sh
    hadop101
    hadop102
    hadop103
    hadop104
    hadop105
    [root@localhost day1121]# 
  3.  for (( 初始值; 条件判断; 步进值 )) ;do 语句块 done
    [root@localhost day1121]# cat test8.sh
    #!/bin/bash
    for ((i=1;i<=5;i++))
    do
        echo $i
    done
    [root@localhost day1121]# bash test8.sh
    1
    2
    3
    4
    5
    [root@localhost day1121]# 
  4. while循环
    1. 初始计数器 while [ 计数器判断 ] do 语句块 计数器步进done
      [root@localhost day1121]# cat test9.sh
      #!/bin/bash
      i=1
      while [ $i -le 5 ]
      do
          echo $i
          let i=i+1
      done
      [root@localhost day1121]# bash test9.sh
      1
      2
      3
      4
      5
      [root@localhost day1121]#
    2. break 退出循环 , continue 重新进⼊下次循环
      [root@localhost day1121]# cat test10.sh
      #!/bin/bash
      #break continue
      i=1
      while [ $i -le 10 ]
      do
          echo $i
          let i=i+1
          if [ $i -eq 6 ]
          then 
              break
          fi
      done
      [root@localhost day1121]# bash test10.sh
      1
      2
      3
      4
      5
      [root@localhost day1121]#
      [root@localhost day1121]# cat test11.sh
      #!/bin/bash
      #break continue
      i=0
      while [ $i -lt 10 ]
      do
          let i=i+1
          if [ $i -eq 7 ]
          then 
              continue
          fi
          echo $i
      done
      [root@localhost day1121]# bash test11.sh
      1
      2
      3
      4
      5
      6
      8
      9
      10
      [root@localhost day1121]#
  5. until 否定 while
    #!/bin/bash
    i=1
    until [ $1 -ge 5 ]
    do
        echo $i
        let i=i+1
    done
  6. 练习: 求1-100的和
    [root@localhost day1121]# cat test13.sh
    #!/bin/bash
    sum=o
    for ((i=1;i<=100;i++))
    do
        let sum=i+sum
    done
    echo "1+2+3+...+100=${sum}"
    [root@localhost day1121]# bash test13.sh
    1+2+3+...+100=5050
    [root@localhost day1121]# 
  7.  练习 99乘法表
    [root@localhost day1121]# cat test14.sh
    #!/bin/bash
    for ((i=1;i<=9;i++))
    do
        for ((j=1;j<=i;j++))
        do
            echo -ne "$i*$j=$((i*j))\t"
        done
        echo
    done
    [root@localhost day1121]# bash test14.sh
    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    
    [root@localhost day1121]#  
  8. 脚本的语法检查和跟踪执⾏
    1. bash -n 仅检查语法
    2. bash -v 根据语句执⾏
    3. bash -x 根据命令执⾏
  9.  使⽤shell脚本 在后台运⾏, nohup 表⽰不挂起执⾏
    1. nohup 命令 >⽂件 2>&1 & (注:如果不指定⽂件会默认⽣成nohup.out)
    2. vim test01.sh
      #!/bin/bash
      while true
      do
      date "+%H:%M:%S" >> out.txt
      sleep 1
      done
      如果直接执⾏ bash test01.sh 光标会⼀直在前台闪烁,不能再运⾏其他命令,ctrl+c停⽌,给它转到 后台运⾏bash test01.sh &
      nohup bash test01.sh & 即使这运⾏的窗⼝关闭或断开
      连接 或注销后,还会继续执⾏
    3. 使⽤jobs命令查看 后台正在运⾏的进程
      [root@hadoop101 day11212]# bash test01.sh&
      [1] 37331
      [root@hadoop101 day11212]# jobs
      [1]+ 运⾏中 bash test01.sh&
    4. bg 任务号 将后台暂停的命令运⾏起来, 可以通过 jobs -l 查看运⾏的使⽤号 使⽤bg 任务号运⾏起来
      [root@hadoop101 day11212]# bash test01.sh
      ^Z (ctrl+z) 暂停前台运⾏
      [1]+ 已停⽌ bash test01.sh
      [root@hadoop101 day11212]# jobs -l
      [1]+ 42086 停⽌ bash test01.sh
      [root@hadoop101 day11212]# bg 1
      [1]+ bash test01.sh &
    5. fg 任务号8 ,将后台暂停的程序,改为前台运⾏
    6. 停止运行
      1. 停⽌前台的运⾏ ctrl+c
      2. 停⽌后台运⾏ kill -9 xxx
        [root@hadoop101 day11212]# jobs -l
        [1]+ 42086 运⾏中 bash test01.sh &
        [root@hadoop101 day11212]# kill -9 42086
        [root@hadoop101 day11212]# jobs -l
        [1]+ 42086 已杀死 bash test01.sh
    7. $RANDOM 表示随机⽣成变量 [0-32767]
      1. ⽣成0-25数字
         echo $(($RANDOM%26))
      2. ⽣成 1-25数字
        1. 0-25 %26
        2. 0+1 - 25+1
           echo $(($RANDOM%25+1))
        3. 游戏 猜数0-100
          #!/bin/bash
          #猜数 1-100
          ((cp=$RANDOM%100+1))
          echo $cp
          while true
          do
          read -p "请输⼊1-100之间的数字:"num1
          if [ $cp -eq $num1 ]
          then
          echo "中中中"
          break
          elif [ $cp -gt $num1 ]
          then
          echo ""
          else
          echo ""
          fi
          done
    8. 数组
      1. 定义数组 数组名=(元素1 元素2 ....)
      2. 引⽤元素值 ${数组名[下标]}
      3. 修改值 数组名[下标]=新值 如: let a[2]=33 或 ((a[2]=33))
      4. 获取数组长度 ${#数组名[*]}
      5. 获取数组长度 ${#数组名[@]}
      6. 获取数组的下标集合 ${!数组名[@]}
      7. 获取数组元素集合 ${数组名[@]}
      8. 例子
        #!/bin/bash
        array=(aa bb cc dd ee)
        for((i=0;i<${#array[@]};i++))
        do
        echo ${array[i]}
        done
        #!/bin/bash
        array=('aa' 'bb' 'cc' 'dd' 'ee')
        for((i=0;i<${#array[@]};i++))
        do
        echo ${array[i]}
        done
        #!/bin/bash
        array=(aa bb cc dd ee)
        for i in ${array[@]}
        do
        echo $i
        done
      9. 函数
        1. function 函数名(){ 函数体}
          #!/bin/bash
          #函数
          function fun1(){
          echo "hello"
          }
          #调⽤
          #fun1
          function fun2(){
          echo hello ${1} and ${2}
          }
          #调⽤
          #fun2 tom jerry
          fun2 $1 $2
          [root@hadoop101 day11212]# bash test0
          6.sh linux shell
          hello linux and shell
        2. 返回值, 通过return返回,再通过$?获取返回值, 返回值必须是0-255之间, 默认是0成功,其他是失败
          #!/bin/bash
          #函数
          function fun1(){
          echo "hello"
          }
          #调⽤
          #fun1
          function fun2(){
          echo 'hello $1 and $2'
          return 1
          }
          #调⽤
          #fun2 tom jerry
          fun2 $1 $2
          echo 返回值是$?
      10. TMOUT 指定 read命令的等待时间 -t效果⼀样
        #!/bin/bash
        #TMOUT
        #TMOUT=5
        read -p "请输⼊你的名字" -t 3 name
        if [[ $? -eq 0 ]]
        then
        echo "你的名字是$name"
        else
        echo -e "\n超时"
        fi
        [root@hadoop101 day11212]# bash test07.sh
        请输⼊你的名字张三
        你的名字是张三
        [root@hadoop101 day11212]# bash test07.sh
        请输⼊你的名字超时

         

posted @ 2023-11-21 18:56  韩世康  阅读(17)  评论(0编辑  收藏  举报