爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      Linux Shell脚本编程提高

      首页 知识中心 软件开发 文章详情页

      Linux Shell脚本编程提高

      2023-05-09 06:04:06 阅读次数:185

      Linux,Shell

      Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核,不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序.Shel编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果,下面我们会介绍Shell-Script的编写.

      Shell 条件判断

      ◆按文件类型判断◆

      Linux Shell脚本编程提高

      1.使用 [] 来执行判断,并使用echo $? 判断执行结果

      [root@localhost ~]# ls
      lyshark.log  passwd.awk
      
      [root@localhost ~]# [ -e ./lyshark.log ]
      [root@localhost ~]# echo $?              #返回0表示文件 ./lyshark.log 存在
      0
      
      [root@localhost ~]# [ -e ./shar ]        #返回1表示文件 ./shar 不存在
      [root@localhost ~]# echo $?
      1
      

      2.我们可以结合之前所学的 && 和 || 实现判断后输出判断结果

      [root@localhost ~]# ls
      lyshark.log  passwd.awk
      
      [root@localhost ~]# [ -e ./lyshark.log ] && echo "check ok" || echo "None"
      check ok
      
      [root@localhost ~]# [ -e ./shar ] && echo "check on" || echo "None"
      None
      

      ◆按文件权限判断◆

      Linux Shell脚本编程提高

      1.使用 -r 判断文件是否可读,和可执行

      [root@localhost ~]# ls
      lyshark.log passwd.awk
      
      [root@localhost ~]# [ -r ./lyshark.log ] && echo "check ok" || echo "None"
      check ok
      
      [root@localhost ~]# [ -x ./lyshark.log ] && echo "check ok" || echo "None"
      None
      
      [root@localhost ~]# [ -r ./lyshark.log ] && [ -x ./lyshark.log ] && echo "可读,可执行" || echo "可读,不可执行" || echo
      "不可读,不可执行"
      
      可读,不可执行
      

      ◆两文件之间的比较◆

      Linux Shell脚本编程提高

      1.通过 -ef 判断是否是相同的I节点

      [root@localhost ~]# ls -li
      total 0
      8409155 -rw-r--r-- 2 root root 0 Sep 25 21:39 lyshark_ln.log
      8409155 -rw-r--r-- 2 root root 0 Sep 25 21:39 lyshark.log
      
      [root@localhost ~]# [ ./lyshark.log -ef lyshark_ln.log ] && echo "ok" || echo "no"
      ok
      

      ◆数值之间的比较◆

      Linux Shell脚本编程提高

      1.比较两数字,大小关系

      [root@localhost ~]# [ 23 -ge 24 ] && echo "23 >= 24 " || echo "23 <= 24"
      23 <= 24
      
      [root@localhost ~]# [ 30 -ge 24 ] && echo "30 >= 24 " || echo "30 <= 24"
      30 >= 24
      

      ◆字符串之间的比较◆

      Linux Shell脚本编程提高

      1.字符串之间的比较例子,字符串是否为空

      [root@localhost ~]# name=LyShark
      [root@localhost ~]# age=""
      [root@localhost ~]# unset sex
      
      [root@localhost ~]# [ -z "$name" ] && echo "字符串空" || echo "不为空"
      不为空
      
      [root@localhost ~]# [ -z "$age" ] && echo "字符串空" || echo "不为空"
      字符串空
      
      [root@localhost ~]# [ -z "$sex" ] && echo "字符串空" || echo "不为空"
      字符串空
      

      2.两个字符串相等比较

      [root@localhost ~]# x=100
      [root@localhost ~]# y=200
      [root@localhost ~]# z=100
      
      [root@localhost ~]# [ "x" == "y" ] && echo "yes" || echo "no"
      no
      [root@localhost ~]# [ "$x" == "$y" ] && echo "yes" || echo "no"
      no
      
      [root@localhost ~]# [ "$x" == "$z" ] && echo "yes" || echo "no"
      yes
      

      ◆多重条件判断◆

      Linux Shell脚本编程提高

      1.逻辑与:判断变量x不为空,并且x大于20

      [root@localhost ~]# declare -i x=10
      [root@localhost ~]# [ -n "$x" -a "$x" -gt 20 ] && echo "yes" || echo "no"
      no
      [root@localhost ~]# declare -i x=30
      [root@localhost ~]# [ -n "$x" -a "$x" -gt 20 ] && echo "yes" || echo "no"
      yes
      

      2.逻辑非:判断x变量不为空,或!取反

      [root@localhost ~]# declare -i x=30
      
      [root@localhost ~]# [ -n "$x" ] && echo "yes" || echo "no"
      yes
      
      [root@localhost ~]# [ ! -n "$x" ] && echo "yes" || echo "no"
      no
      

       

      IF条件判断

      if、then、else语句用于判断给定的条件是否满足,并根据测试条件的真假来选择相应的操作.if/else仅仅用于两分支判断,多分支的选择时需要用到if/else语句嵌套、if/elif/else和case多分支选择判断结构.

      IF结构例子: 一个就简单的单分支结构.测试条件后如果没有";"则then语句要换行.

      #!/bin/sh
      echo "Please input a Number:"
      read Num
       
      if [ "$Num" -lt 15 ]
      then
      	echo "$Num <= 15"
      fi
      

      IF/IF-ELSE结构: 一个双分支结构,如下执行删除文件,成功返回then是否返回else.

      #!/bin/sh
       
      echo "Please input the file which you want to delete:"
      read file
       
      if rm -f "$file"
      then
        echo "Delete the file $file  sucessfully!"
      else
        echo "Delete the file $file failed!"
      fi
      

      IF/ELSE嵌套: 可同时判断三个或三个以上条件,但要注意if与else配对关系,else语句总是与它上面最近的未配对的if配对.

      #!/bin/bash
      #提示用户输入分数(0-100)
      echo "Please Input a integer(0-100): "
      read score
      
      #判断学生的分数类别
      if [ "$score" -lt 0 -o "$score" -gt 100 ]
      then
         echo "The score what you input is not integer or the score is not in (0-100)."
      else
           if [ "$score" -ge 90 ]
           then
               echo "The grade is A!"
           else
                if [ "$score" -ge 80 ]
                then
                    echo "The grade is B!"
                else
                     if [ "$score" -ge 70 ]
                    then
                         echo "The grade is C!"
                    else
                         if [ "$score" -ge 60 ]
                         then
                              echo "The grade is D!"
                         else
                              echo "The grade is E!"
                         fi
                    fi
               fi
          fi
      fi
      

      IF/ELIF/ELSE结构: if/else嵌套在编程中很容易漏掉then或fi产生错误,而且可读性很差,因此引入if/elif/else结构针对某一事件的多种情况进行处理,fi只出现一次,可读性也提高了.

      #!/bin/bash  
       
      echo "Please Input a integer(0-100): "
      read score
       
      if [ "$score" -lt 0 -o "$score" -gt 100 ]
      then
          echo "The score what you input is not integer or the score is not in (0-100)."
      elif [ "$score" -ge 90 ]
      then
          echo "The grade is A!"
      elif [ "$score" -ge 80 ]
      then
          echo "The grade is B!"
      elif [ "$score" -ge 70 ]
      then
          echo "The grade is C!"
      elif [ "$score" -ge 60 ]
      then
          echo "The grade is D!"
      else
          echo "The grade is E!"
      fi
      

      实例1: 通过单分支判断磁盘是否已满.

      [root@localhost ~]# cat if.sh
      
      #!/bin/bash
      
      ret=$( df -h | grep "/dev/sda1" | awk '{printf $5}' | cut -d "%" -f 1 )
      if [ $ret -ge 80 ]
      then
              echo -e "/dev/sda1 is full !!"
      fi
      

      实例2: 通过多分支判断磁盘是否已满.

      [root@localhost ~]# cat if.sh
      #!/bin/bash
      
      ret=$( df -h | grep "/dev/sda1" | awk '{printf $5}' | cut -d "%" -f 1 )
      if [ $ret -ge 80 ]
      then
              echo -e "/dev/sda1 is full !"
      else
              echo -e "/dev/sda1 is not full !"
      fi
      

      实例3: 多分支判断小例子.

      [root@localhost ~]# cat if.sh
      #!/bin/bash
      
      read -p "输入一个数字:" num
      
      if [ "$num" -gt "100" ]
      then
              echo -e "这个数大于100"
      elif [ "$num" -lt "100" ]
      then
              echo -e "这个数小于100"
      elif [ "$num" -eq "100" ]
      then
              echo -e "这个数等于100"
      fi
      

      实例4: 判断输入的年份是否是润年(润年条件:1、能被4整除,但不能被100整除的年份.2、能被100整除,又能被400整除的年份)

      #!/bin/sh
        
      echo "Please Input a year: "
      read year
       
      let "n1=$year % 4"
      let "n2=$year % 100"
      let "n3=$year % 400"
      if [ "$n1" -ne 0 ]
      then
          leap=0
      elif [ "$n2" -ne 0 ]
      then
          leap=1
      elif [ "$n3" -ne 0 ]
      then
          leap=0
      else
          leap=1
      fi
      

       

      CASE分支结构

      case结构变量值依次比较,遇到双分号则跳到esac后的语句执行,没有匹配则脚本将执行默认值*"后的命令,直到"';;"为止.case的匹配值必须是常量或正则表达式.

      #!/bin/bash
      
      read -p "输入一个符号:" temp
      
      case $temp in
      
              "-print")
                      echo -e "您执行了print函数"
              ;;
              "-save")
                      echo -e "您执行了save函数"
              ;;
              "-help")
                      echo -e "您执行了help函数"
              ;;
              *)
                      echo -e "您执行了其他操作"
              ;;
      esac
      

       

      FOR循环结构

      Shell编程中循环命令用于特定条件下决定某些语句重复执行的控制方式,有三种常用的循环语句:for、while和until.while循环和for循环属于"当型循环",而until属于"直到型循环",循环控制符:break和continue控制流程转向.

      列表FOR循环: 循环打印数据分别从1遍历到5.

      do和done之间的命令称为循环体,执行次数和list列表中常数或字符串的个数相同.for循环,首先将in后list列表的第一个常数或字符串赋值给循环变量,然后执行循环体,以此执行list,最后执行done命令后的命令序列.

      #!/bin/bash
       
      for tmp in {1..5}
      do
           echo "Hello, Welcome $tmp times"
      done
      

      FOR循环累加: 通过FOR循环累加打印数据.

      通过i的按步数2不断递增,计算sum值为2500.同样可以使用seq命令实现按2递增来计算1~100内的所有奇数之和,for i in $(seq 1 2 100),seq表示起始数为1,跳跃的步数为2,结束条件值为100.

      #!/bin/bash
      sum=0
       
      for i in {1..100..2}
      do
          let "sum+=i"
      done
      
      echo "sum=$sum"
      

      FOR循环遍历目录: 通过for循环显示当前目录下所有的文件.

      #!/bin/bash
       
      for file in $( ls )
      #for file in *
      do
         echo "file: $file"
      done
      

      不带列表FOR: 由用户制定参数和参数的个数,与上述的for循环列表参数功能相同.

      #!/bin/bash
      
      echo "number of arguments is $#"
      echo "What you input is: "
      
      for argument
      do
          echo "$argument"
      done
      

      C风格FOR循环: 也被称为计次循环.

      #!/bin/bash
      for((integer = 1; integer <= 5; integer++))
      do
          echo "$integer"
      done
      

      实例1: 通过for循环打印1-10.

      [root@localhost ~]# cat for.sh
      #!/bin/bash
      
      for temp in `seq 1 10`
      do
              echo -e "打印数据: $temp"
      done
      

      实例2: 通过for循环计算1-100的累加和.

      [root@localhost ~]# cat for.sh
      #!/bin/bash
      
      declare -i sum=0
      
      for temp in `seq 1 100`
      do
              sum=$sum+$temp
      done
      
      echo -e "从1+到100的结果是: $sum"
      

      实例3: 从列表中选择数据.

      [root@localhost ~]# cat for.sh
      #!/bin/bash
      
      for temp in 1 3 5 7 9
      do
              echo -e "打印: $temp"
      done
      
      [root@localhost ~]# bash for.sh
      打印: 1
      打印: 3
      打印: 5
      打印: 7
      打印: 9
      

      实例4: 读取文件内容并打印.

      [root@localhost ~]# cat for.sh
      #!/bin/bash
      
      world=`cat /etc/passwd`
      for temp in $world
      do
              echo -e "打印: $temp"
      done
      

       

      WHILE 循环

      也称为前测试循环语句,重复次数是利用一个条件来控制是否继续重复执行这个语句.为了避免死循环,必须保证循环体中包含循环出口条件即表达式存在退出状态为非0的情况.

      计数控制: 指定了循环的次数500,初始化计数器值为1,不断测试循环条件i是否小于等于100.在循环条件中设置了计数器加2来计算1~100内所有的奇数之和.

      #!/bin/bash
       
      sum=0
       
      i=1
       
      while(( i <= 100 ))
      do
           let "sum+=i"
           let "i += 2"   
      done
       
      echo "sum=$sum"
      

      结束标记控制的while循环: 设置一个特殊的数据值(结束标记)来结束while循环.

      #!/bin/bash
       
      echo "Please input the num(1-10) "
      read num
       
      while [[ "$num" != 4 ]]
      do 
         if [ "$num" -lt 4 ]
         then
              echo "Too small. Try again!"
              read num
         elif [ "$num" -gt 4 ]
         then
               echo "To high. Try again" 
               read num
         else
             exit 0
          fi
      done 
       
      echo "Congratulation, you are right! "
      

      标志控制的while循环: 使用用户输入的标志值来控制循环的结束(避免不知道循环结束标志的条件).

      #!/bin/bash
       
      echo "Please input the num "
      read num
       
      sum=0
      i=1
       
      signal=0
       
      while [[ "$signal" -ne 1 ]]
      do
          if [ "$i" -eq "$num" ]
          then 
             let "signal=1"
             let "sum+=i"
             echo "1+2+...+$num=$sum"
          else
             let "sum=sum+i"
             let "i++"
          fi
      done
      

      命令行控制的while循环: 使用命令行来指定输出参数和参数个数,通常与shift结合使用,shift命令使位置变量下移一位($2代替$1、$3代替$2,并使$#变量递减),当最后一个参数显示给用户,$#会等于0,$*也等于空.

      #!/bin/bash
      
      echo "number of arguments is $#"
      echo "What you input is: "
       
      while [[ "$*" != "" ]]
      do
          echo "$1"
          shift
      done
      

      while计算: 通过while循环,计算1-100的累加和.

      [root@localhost ~]# cat while.sh
      #!/bin/bash
      
      declare -i x=0
      declare -i num=0
      
      while [ "$x" -lt "100" ]
      do
              x=$x+1
              num=$num+$x
      done
      
      echo -e "从1-100结果是: $num"
      
      [root@localhost ~]# bash while.sh
      从1-100结果是: 5050
      

       

      UNTIL 循环

      until命令和while命令类似,while能实现的脚本until同样也可以实现,但区别是until循环的退出状态是不为0,退出状态是为0(与while刚好相反),即whie循环在条件为真时继续执行循环而until则在条件为假时执行循环.

      #!/bin/bash
       
      i=0
       
      until [[ "$i" -gt 5 ]]    #大于5
      do
          let "square=i*i"
          echo "$i * $i = $square"
          let "i++"
      done
      
      #!/bin/bash
       
      for (( i = 1; i <=9; i++ ))
      do
          
          for (( j=1; j <= i; j++ ))
          do
              let "temp = i * j"     
              echo -n "$i*$j=$temp  "
           done 
           
           echo ""   #output newline
      done
      
      #!/bin/bash
      
      i=0
      
      until [[ "$i" -gt 5 ]]    #大于5
      
      do
      
          let "square=i*i"
      
          echo "$i * $i = $square"
      
          let "i++"
      
      done
      

       

      跳出语句(break,continue)

      break: 在for、while和until循环中break可强行退出循环,break语句仅能退出当前的循环,如果是两层循环嵌套,则需要在外层循环中使用break.

      #!/bin/bash
       
      sum=0
      for (( i=1; i <= 100; i++))
      do 
          let "sum+=i"
       
          if [ "$sum" -gt 1000 ]
          then
              echo "1+2+...+$i=$sum"
              break
          fi
      done
      

      continue: 在for、while和until中用于让脚本跳过其后面的语句,执行下一次循环.continue用于显示100内能被7整除的数.

      #!/bin/bash
       
      m=1
      for (( i=1; i < 100; i++ ))
      do
          let "temp1=i%7"         #被7整除
       
          if [ "$temp1" -ne 0 ]
          then
              continue
          fi
          
          echo -n "$i  "
          
          let "temp2=m%7"          #7个数字换一行
          
          if  [ "$temp2" -eq 0 ]
          then
              echo ""
          fi
          
          let "m++"
      done
      

       

      SELECT 语句

      select结构从技术角度看不能算是循环结构,只是相似而已,它是bash的扩展结构用于交互式菜单显示,功能类似于case结构比case的交互性要好.

      [root@localhost ~]# cat select.sh
      #!/bin/bash
      
      echo -e "请选择系统类型?"
      
      select var in "Linux" "GNU HURD" "FreeBSD" "Other";
      do
              if [ $var == "Linux" ]
              then
                      echo -e "您的系统是Linux"
              elif [ $var == "FreeBSD" ]
              then
                      echo -e "您的系统是FreeBSD"
              fi
      break
      done
      [root@localhost ~]# bash select.sh
      请选择系统类型?
      1) Linux
      2) GNU HURD
      3) FreeBSD
      4) Other
      
      #? 1
      您的系统是Linux
      
      
      #!/bin/bash
      
      declare -a serial
      serial=(1 2 3 4)
      PS3="Enter a number: "
      
      
      select var in "a" "b" "c" "d"
      do
          if ! echo ${serial[@]} | grep -q $REPLY
              then
                      echo "please enter [1-4]."
                      continue
          fi
      
              echo "your anwser is: $var"
              break
      done
      
      [root@localhost ~]# bash select.sh
      1) a
      2) b
      3) c
      4) d
      Enter a number: 1
      your anwser is: a
      

       

      FUNCTION 函数

      [root@localhost ~]# cat function.sh
      #!/bin/bash
      
      function my_print()
      {
              echo -e "------------------------"
              echo -e "hello world"
              echo -e "------------------------"
              return "127"
      }
      
      
      my_print
      echo $?
      
      [root@localhost ~]# bash function.sh
      ------------------------
      hello world
      ------------------------
      127
      

       

      标准输入输出

      标准输出: echo命令直接输出指定的字符串,或在Shell环境下直接打印字符串变量中的数据.

      [root@localhost ~]# echo --help
      
      语法格式:[ echo [选项] [输出内容] ]
      
              -e              #支持反斜线控制的字符转换
              -n              #取消输出后行尾的换行符号
      

      该命令的控制字符如下所示.

      -----------------------------------------------------------------------------------------
              \\              #输出\本身
              \a              #输出警告音 
              \b              #退格键,也就是向左删除键 
              \c              #取消输出行末的换行符,和"-n"选项一致 
              \e              #ESCAPE键    
              \f              #换页符     
              \n              #换行符       
              \r              #回车键    
              \t              #制表符,也就是Tab键 
              \v              #垂直制表符 
              \0nnn           #按照八进制ASCII码输出字符,其中0为数字零,nnn是三位八进制数
              \xhh            #按照十六进制ASCII码表输出字符,其中hh是两位十六进制数 
      -----------------------------------------------------------------------------------------
      

      一些特殊的输出格式.

              \\              #输出\本身
              "\e[1"          #代表颜色输入开始
              "\e[0m"         #代表颜色输入结束
              \e[0m           #关闭所有属性
              \e[1m           #设置高亮度
              \e[4m           #下划线 
              \e[5m           #闪烁
              \e[7m           #反显 
              \e[8m           #消隐
              \e[nA           #光标上移n行 
              \e[nB           #光标下移n行 
              \e[nC           #光标右移n行 
              \e[nD           #光标左移n行 
              \e[y;xH         #设置光标位置 
              \e[2J           #清屏 
              \e[K            #清除从光标到行尾的内容 
              \e[s            #保存光标位置 
              \e[u            #恢复光标位置 
              \e[25l          #隐藏光标 
              \e[25h          #显示光标
      -----------------------------------------------------------------------------------------
      文字颜色和底纹颜色:
      
      文字颜色代码:30=黑色,31=红色,32=绿色,33=黄色,34=蓝色,35=洋红,36=青色,37=白色,39=结束
      底纹颜色代码:40=黑色,41=红色,42=绿色,43=黄色,44=蓝色,45=洋红,46=青色,47=白色,49=结束
      -----------------------------------------------------------------------------------------
      

      输出一个红字,并且黄底的"hello world"

      [root@localhost ~]# echo -e "\e[31;43m hello world \e[0m"
      
      hello world
      

      输出\a本身

      [root@localhost ~]# echo -e "\\\a"
      
      \a
      

      文本格式化: printf 文本格式化输出命令

      [root@localhost ~]# printf --help
      
      输出类型:
              %ns:            #输出字符串,n是数字,指代输出几个字符
              %ni:            #输出证书,n是数字,指代输出几个数字
              %m.nf:          #输出浮点数,m和n是数字,指代输出整数位和小数位
      
      输出格式:
              \a:             #输出警告音
              \b:             #输出退格键,也就是Backspace键
              \f:             #清屏
              \n:             #换行符
              \r:             #回车,也就是Enter键
              \t:             #水平输出退格键,也就是Tab键
              \v:             #垂直输出退格键,也就是Tab键
      
      #注意:print 和 printf 的主要区别在有 printf 是标准的格式化输出,必须手动指定换行和tab.
      

      在进行实验之前,首先创建一个文件,来做测试用

      [root@localhost ~]# cat lyshark.log
      
      ID      NAME    AGE     Gender  Mark
      1       WR      22      m       100
      2       LC      26      m       90
      3       LY      23      m       88
      4       XDL     40      b       100
      

      通过 printf 函数打印文本内容,如果不指定输出格式,则会把所有输出内容连在一起输出

      [root@localhost ~]# printf '%s' $(cat lyshark.log)
      
      IDNAMEAGEGenderMark1WR22m1002LC26m903LY23m884XDL40b100
      

      通过 printf 格式化后输出一段文本

      [root@localhost ~]# printf '%s\t %s\t %s\t %s\t %s\t \n' $(cat lyshark.log)
      
      ID       NAME    AGE     Gender  Mark
      1        WR      22      m       100
      2        LC      26      m       90
      3        LY      23      m       88
      4        XDL     40      b       100
      

      通过 printf 按照整数型和浮点型输出,则需要修改

      [root@localhost ~]# printf '%i\t %s\t %8.2f\t %s\t %s\t \n' $(cat lyshark.log |grep -v ID)
      1        WR         22.00        m       100
      2        LC         26.00        m       90
      3        LY         23.00        m       88
      4        XDL        40.00        b       100
      

      标准输入: read命令从键盘读取变量的值,通常用在shell脚本中与用户进行交互的场合.

      [root@localhost ~]# read --help
      
      语法格式:[ read [选项] [输出内容] ]
      
              -p              #"提示信息",指定读取值时的提示符
              -t              #指定读取值时等待的时间(秒),read等待的秒数
              -n              #指定最多能接收的字符数(达到即执行)
              -s              #隐藏输入信息
      

      通过Read命令读取一个值

      [root@localhost ~]# read temp
      hello Lyshark
      
      [root@localhost ~]# echo $temp
      hello Lyshark
      

      通过read命令读取,并输出一段提示信息,且10秒等待输入时间

      [root@localhost ~]# read -p "please input name" -t 10 temp
      wangrui
      
      [root@localhost ~]# echo $temp
      wangrui
      

       

      变量与运算符

      基本的变量声明:

      变量名称可以由字母、数字和下划线组成,但是不能以数字开头,变量中间不能有空格

      [root@localhost ~]# name=lyshark
      [root@localhost ~]# echo $name
      lyshark
      
      [root@localhost ~]# 1name=lyshark
      -bash: 1name=lyshark: command not found
      

      在bash中变量的默认类型都是字符串型,如果要进行数值运算,则必修指定变量类型为数值型

      [root@localhost ~]# x=10
      [root@localhost ~]# y=20
      [root@localhost ~]# sum=$x+$y
      
      [root@localhost ~]# echo $sum
      10+20
      

      变量用等号连接值,等号左右两侧不能有空格,如出现空格汇报错误

      [root@localhost ~]# name=lyshark
      [root@localhost ~]# echo $name
      lyshark
      
      [root@localhost ~]# name = lyshark
      -bash: name: command not found
      
      [root@localhost ~]# temp="hello lyshark"
      [root@localhost ~]# echo $temp
      hello lyshark
      

      反引号引起来的会当作命令执行并返回结果,单引号则为输出字符串,反斜线为脱意字符

      [root@localhost ~]# echo `date`
      Sun Sep 23 23:51:38 EDT 2018
      
      [root@localhost ~]# echo "`date`"
      Sun Sep 23 23:51:45 EDT 2018
      
      [root@localhost ~]# echo "$(date)"
      Sun Sep 23 23:51:52 EDT 2018
      
      [root@localhost ~]# echo "\$(date)"
      $(date)
      

      变量叠加:如果需要增加变量的值,那么可以进行变量值的叠加,叠加需要使用双引号包括.

      [root@localhost ~]# name=lyshark
      [root@localhost ~]# temp="$name is"
      [root@localhost ~]# echo $temp
      lyshark is
      
      [root@localhost ~]# end="${temp} hack"
      [root@localhost ~]# echo $end
      lyshark is hack
      
      [root@localhost ~]# PATH=$PATH:/usr/bin/myapp
      [root@localhost ~]# echo $PATH
      

      参数传递:通过命令行传递参数,并打印这写参数的详细信息.

      [root@localhost ~]# cat shell.sh
      #!/bin/bash
      echo -e "脚本名称:" $0
      echo -e "参数1:" $1
      echo -e "参数2: " $2
      echo -e "参数3: " $3
      echo -e "显示所有参数(作为一个整体显示): $*"
      echo -e "显示所有参数(分页显示/分开接收): $@"
      echo -e "显示参数个数: $#"
      echo -e "实现计算器功能: $(($1$2$3))"
      
      [root@localhost ~]# bash shell.sh 10 + 20
      脚本名称: shell.sh
      参数1: 10
      参数2:  +
      参数3:  20
      显示所有参数(作为一个整体显示): 10 + 20
      显示所有参数(分页显示/分开接收): 10 + 20
      显示参数个数: 3
      实现计算器功能: 30
      

      $? 判断上一条命令执行状态,成功返回0,失败返回非0

      [root@localhost ~]# ls -l
      [root@localhost ~]# echo $?   ←上条执行成功返0
      0
      

      $$ 返回自身进程号

      [root@localhost ~]# cat d.sh
      #!/bin/bash
      echo "本脚本的进程号是: $$"
      
      [root@localhost ~]# bash d.sh
      本脚本的进程号是: 1540
      

      $! 返回最后一个后台执行的命令进程ID号

      [root@localhost ~]# cat e.sh
      #!/bin/bash
      find / -name "*.log" &
      echo "最后一个后台执行的命令进程是: $!"
      
      [root@localhost ~]# bash e.sh
      最后一个后台执行的命令进程是: 1546
      

      SHELL实现定义数组:

      声明定义数组:声明数组并定义元素,打印

      [root@localhost ~]# declare -a name           #声明name为数组
      [root@localhost ~]# name[0]="hello world"     #给数组name[0]赋值
      [root@localhost ~]# name[1]="hello lyshark"   #给数组name[1]赋值
      
      [root@localhost ~]# echo $name                #默认打印name[0],因为下标从0开始
      hello world
      
      [root@localhost ~]# name[2]="hello myblog"    #给数组name[2]赋值
      [root@localhost ~]# echo "${name[*]}"         #打印数组全部元素
      hello world hello lyshark hello myblog
      
      [root@localhost ~]# echo ${#name[*]}          #统计数组元素个数
      3
      [root@localhost ~]# echo ${#name[@]}          #统计数组元素个数
      3
      
      [root@localhost ~]# declare -p name           #打印数组元素
      declare -a name='([0]="hello world" [1]="hello lyshark" [2]="hello myblog")'
      
      [root@localhost ~]# unset name                #使用结束,撤销数组
      [root@localhost ~]# declare -a num=(1 2 3 4 5)   #声明num为数组,并在声明是赋值
      [root@localhost ~]# echo ${#num[*]}              #正确,一共有5个元素
      5
      
      [root@localhost ~]# declare -p num               #分别打印数组中的元素
      declare -a num='([0]="1" [1]="2" [2]="3" [3]="4" [4]="5")'
      [root@localhost ~]# unset num                    #使用结束,撤销数组
      

      定义初始化数组: 数组定义的多种方法(定义并初始化)

      ----------------------------------------------------------------------------------------------------
      [方法1]
      [root@localhost ~]# declare -a array_name=(Jerry Alice David LyShark)           #通过命令行一部到位
      [root@localhost ~]# declare -p array_name                                       #打印查看结果
      declare -a array_name='([0]="Jerry" [1]="Alice" [2]="David" [3]="LyShark")'
      ----------------------------------------------------------------------------------------------------
      [方法2]
      [root@localhost ~]# declare -a array_name                                       #先声明array_name数组
      [root@localhost ~]# array_name=(Jerry Alice David LyShark)                      #紧接着打印
      [root@localhost ~]# declare -p array_name
      declare -a array_name='([0]="Jerry" [1]="Alice" [2]="David" [3]="LyShark")'
      ----------------------------------------------------------------------------------------------------
      [方法3]
      [root@localhost ~]# string="Jerry Alice Daid LyShark"                           #声明一个字符串
      [root@localhost ~]# array_name=($string)                                        #直接转换成数组
      [root@localhost ~]# declare -p array_name
      declare -a array_name='([0]="Jerry" [1]="Alice" [2]="Daid" [3]="LyShark")'
      ----------------------------------------------------------------------------------------------------
      [方法4]
      [root@localhost ~]# declare -a array_name                                         #声明一个字符串
      [root@localhost ~]# array_name=([0]="LyShark" [1]="Daid" [2]="Alice" [3]="Jerry") #直接转换成数组
      
      [root@localhost ~]# echo ${array_name[@]}                                        #查询数组元素
      LyShark Daid Alice Jerry
      
      [root@localhost ~]# declare -p array_name                                        #命令行查询
      declare -a array_name='([0]="LyShark" [1]="Daid" [2]="Alice" [3]="Jerry")'
      
      [root@localhost ~]# unset array_name                                             #使用结束,撤销数组
      ----------------------------------------------------------------------------------------------------
      

      求数组长度: 求数组长度,和单个数组元素长度.

      [root@localhost ~]# declare -a array_name=(Jerry Alice David LyShark)            #声明测试数组
      [root@localhost ~]# echo ${array_name[*]}                                        #打印全部数组元素
      Jerry Alice David LyShark
      
      [root@localhost ~]# echo ${#array_name[*]}                                       #显示全部数组数
      4
      [root@localhost ~]# echo ${#array_name[@]}                                       #显示全部数组数
      4
      
      [root@localhost ~]# echo ${#array_name[0]}                                       #显示name[0]字符个数
      5
      [root@localhost ~]# echo ${#array_name[3]}                                       #显示name[3]字符个数
      7
      
      [root@localhost ~]# unset array_name                                             #使用结束,撤销数组
      

      声明实现算数: 通过声明实现,整数计算

      [root@localhost ~]# x=10
      [root@localhost ~]# y=20
      [root@localhost ~]#
      [root@localhost ~]# declare -i temp=$x+$y
      [root@localhost ~]#
      [root@localhost ~]# echo $temp
      30
      

      声明环境变量: 通过declare声明环境变量,和export是同样的效果

      [root@localhost ~]# declare -x NAMES="LyShark"
      [root@localhost ~]# env |grep NAMES
      NAMES=LyShark
      
      [root@localhost ~]# unset NAMES
      

      设置只读变量: 设置只读变量,只能读取变量,无法改变其数值

      [root@localhost ~]# declare -r test="hello world"
      [root@localhost ~]# echo $test
      hello world
      
      [root@localhost ~]# test=1234           #这里由于设置了只读属性,所以无法修改
      -bash: test: readonly variable
      

      SHELL实现算数运算:

      expr加法乘法运算:使用expr完成一次加法和乘法运算,(运算符两边必须要有空格,否则不会运算)

      [root@localhost ~]# declare -i x=10
      [root@localhost ~]# declare -i y=20
      
      [root@localhost ~]# temp=$(expr $x + $y )
      [root@localhost ~]# echo $temp
      30
      [root@localhost ~]# temp=$(expr $x * $y )
      [root@localhost ~]# echo $temp
      200
      

      let加法乘法运算: 使用let完成一次加法与乘法运算,(此处并没有严格规定运算符两边的距离)

      [root@localhost ~]# declare -i x=100
      [root@localhost ~]# declare -i y=200
      
      [root@localhost ~]# let temp=$x+$y
      [root@localhost ~]# echo $temp
      300
      [root@localhost ~]# let temp=$x*$y
      [root@localhost ~]# echo $temp
      20000
      

      let ++ --: let实现数值每次递增或递减1,类似C语言中的 x++

      [root@localhost ~]# declare -i num=1
      
      [root@localhost ~]# let num++
      [root@localhost ~]# echo $num
      2
      [root@localhost ~]# let num++
      [root@localhost ~]# echo $num
      3
      [root@localhost ~]# let num--
      [root@localhost ~]# echo $num
      2
      [root@localhost ~]# let --num
      [root@localhost ~]# echo $num
      1
      

      let x+=y: let数值每次递增或递减x,类似C语言中的 x+=y

      [root@localhost ~]# declare -i num=1
      
      [root@localhost ~]# let num+=1
      [root@localhost ~]# echo $num
      2
      [root@localhost ~]# let num-=1
      [root@localhost ~]# echo $num
      1
      [root@localhost ~]# let num+=10
      [root@localhost ~]# echo $num
      11
      

      特殊格式运算: 使用"$((运算式))" 或 "$[运算式]" 格式进行算数运算

      [root@localhost ~]# declare -i x=100
      [root@localhost ~]# declare -i y=150
      
      [root@localhost ~]# temp=$(( $x+$y ))
      [root@localhost ~]# echo $temp
      250
      [root@localhost ~]# temp=$[ $x*$y ]
      [root@localhost ~]# echo $temp
      15000
      

       

      单行条件判断

      按文件类型判断:

      -b     #判断文件是否为块设备
      -c     #判断是否为字符设备文件
      -d     #判断是否为目录文件
      -e     #判断文件是否存在
      -f     #判断是否为普通文件
      -L     #判断是否为符号链接文件
      -p     #判断是否为管道文件
      -s     #判断文件是否为非空(非空为真)
      -S     #判断是否为套接字文件
      

      使用-e判断文件是否存在,返回0表示存在,非零为不存在,可以检测$?来确定是否成功.

      [root@localhost ~]# [ -e /etc/passwd ]
      [root@localhost ~]# echo $?
      0
      [root@localhost ~]# [ -e /etc/lyshark ]
      [root@localhost ~]# echo $?
      1
      

      除此之外,我们还可以结合之前所学的&&和||实现判断后输出判断结果.

      [root@localhost ~]# [ -e /etc/passwd ] && echo "ok" || echo "no"
      ok
      [root@localhost ~]# [ -e /etc/lyshark ] && echo "ok" || echo "no"
      no
      

      按文件权限判断:

      -r     #判断文件是否具有读权限
      -w     #判断文件是否拥有写权限
      -x     #判断文件是否拥有执行权限
      -u     #判断文件是否具有SUID权限
      -g     #判断文件是否具有SGID权限
      -k     #判断文件是否具有SBIT权限
      

      判断文件是否可读,且是否可被执行,如下:

      [root@localhost ~]# [ -r /bin/bash ] && echo "ok" || echo "no"
      ok
      [root@localhost ~]# [ -r /bin/bash ] && [ -x /bin/bash ] && echo "ok" || echo "no"
      ok
      

      两文件之间的比较:

      file1 -nt file2     #判断文件1的修改时间是否比文件2新(如果新则返回真)
      file1 -ot file2     #判断文件1的修改时间是否比文件2旧(如果旧则返回真)
      file1 -ef file2     #判断文件1是否和文件2的I节点是否一致,两文件是否为同一个文件.
      

      通过使用-ef判断两个文件是否拥有同一个I节点号.

      [root@localhost ~]# ls -li
      total 0
      8409155 -rw-r--r-- 2 root root 0 Sep 25 21:39 lyshark_ln.log
      8409155 -rw-r--r-- 2 root root 0 Sep 25 21:39 lyshark.log
      
      [root@localhost ~]# [ ./lyshark.log -ef lyshark_ln.log ] && echo "ok" || echo "no"
      ok
      

      数值之间的比较:

      number1 -eq number2     #判断number1是否等于number2
      number1 -ne number2     #判断number1是否不等于number2
      number1 -gt number2     #判断number1是否大于number2
      number1 -lt number2     #判断number1是否小于number2
      number1 -ge number2     #判断number1是否大于等于number2
      number1 -le number2     #判断number1是否小于等于number2
      

      比较两数字,大小关系

      [root@localhost ~]# [ 23 -ge 24 ] && echo "23 >= 24 " || echo "23 <= 24"
      23 <= 24
      
      [root@localhost ~]# [ 30 -ge 24 ] && echo "30 >= 24 " || echo "30 <= 24"
      30 >= 24
      

      字符串之间比较:

      -z string          #判断字符串是否为空
      -n string          #判断字符串是否非空
      string1 == string2 #判断string1等于string2
      string1 != string2 #判断string1不等于string2
      

      字符串之间的比较例子,字符串是否为空

      [root@localhost ~]# name=LyShark
      [root@localhost ~]# age=""
      [root@localhost ~]# unset sex
      
      [root@localhost ~]# [ -z "$name" ] && echo "字符串空" || echo "不为空"
      不为空
      [root@localhost ~]# [ -z "$age" ] && echo "字符串空" || echo "不为空"
      字符串空
      [root@localhost ~]# [ -z "$sex" ] && echo "字符串空" || echo "不为空"
      字符串空
      

      两个字符串相等比较

      [root@localhost ~]# x=100
      [root@localhost ~]# y=200
      [root@localhost ~]# z=100
      
      [root@localhost ~]# [ "x" == "y" ] && echo "yes" || echo "no"
      no
      [root@localhost ~]# [ "$x" == "$y" ] && echo "yes" || echo "no"
      no
      [root@localhost ~]# [ "$x" == "$z" ] && echo "yes" || echo "no"
      yes
      

      多重条件判断:

      逻辑与:判断变量x不为空,并且x大于20

      [root@localhost ~]# declare -i x=10
      [root@localhost ~]# [ -n "$x" -a "$x" -gt 20 ] && echo "yes" || echo "no"
      no
      [root@localhost ~]# declare -i x=30
      [root@localhost ~]# [ -n "$x" -a "$x" -gt 20 ] && echo "yes" || echo "no"
      yes
      

      逻辑非:判断x变量不为空,或!取反

      [root@localhost ~]# declare -i x=30
      
      [root@localhost ~]# [ -n "$x" ] && echo "yes" || echo "no"
      yes
      [root@localhost ~]# [ ! -n "$x" ] && echo "yes" || echo "no"
      no
      

       

      IF条件判断

      IF结构例子: 一个就简单的单分支结构.测试条件后如果没有";"则then语句要换行.

      #!/bin/sh
      echo "Please input a Number:"
      read Num
       
      if [ "$Num" -lt 15 ]
      then
          echo "$Num <= 15"
      fi
      

      IF/IF-ELSE结构: 一个双分支结构,如下执行删除文件,成功返回then是否返回else.

      #!/bin/sh
       
      echo "Please input the file which you want to delete:"
      read file
       
      if rm -f "$file"
      then
        echo "Delete the file $file  sucessfully!"
      else
        echo "Delete the file $file failed!"
      fi
      

      IF/ELSE嵌套: 可同时判断三个或三个以上条件,但要注意if与else配对关系,else语句总是与它上面最近的未配对的if配对.

      #!/bin/bash
      #提示用户输入分数(0-100)
      echo "Please Input a integer(0-100): "
      read score
      
      #判断学生的分数类别
      if [ "$score" -lt 0 -o "$score" -gt 100 ]
      then
         echo "The score what you input is not integer or the score is not in (0-100)."
      else
           if [ "$score" -ge 90 ]
           then
               echo "The grade is A!"
           else
                if [ "$score" -ge 80 ]
                then
                    echo "The grade is B!"
                else
                     if [ "$score" -ge 70 ]
                    then
                         echo "The grade is C!"
                    else
                         if [ "$score" -ge 60 ]
                         then
                              echo "The grade is D!"
                         else
                              echo "The grade is E!"
                         fi
                    fi
               fi
          fi
      fi
      

      IF/ELIF/ELSE结构: if/else嵌套在编程中很容易漏掉then或fi产生错误,而且可读性很差,因此引入if/elif/else结构针对某一事件的多种情况进行处理,fi只出现一次,可读性也提高了.

      #!/bin/bash  
       
      echo "Please Input a integer(0-100): "
      read score
       
      if [ "$score" -lt 0 -o "$score" -gt 100 ]
      then
          echo "The score what you input is not integer or the score is not in (0-100)."
      elif [ "$score" -ge 90 ]
      then
          echo "The grade is A!"
      elif [ "$score" -ge 80 ]
      then
          echo "The grade is B!"
      elif [ "$score" -ge 70 ]
      then
          echo "The grade is C!"
      elif [ "$score" -ge 60 ]
      then
          echo "The grade is D!"
      else
          echo "The grade is E!"
      fi
      

       

      分支语句实现

      #!/bin/bash
      
      read -p "输入一个符号:" temp
      
      case $temp in
      
              "-print")
                      echo -e "您执行了print函数"
              ;;
              "-save")
                      echo -e "您执行了save函数"
              ;;
              "-help")
                      echo -e "您执行了help函数"
              ;;
              *)
                      echo -e "您执行了其他操作"
              ;;
      esac
      
      [root@localhost ~]# cat select.sh
      #!/bin/bash
      
      echo -e "请选择系统类型?"
      
      select var in "Linux" "GNU HURD" "FreeBSD" "Other";
      do
              if [ $var == "Linux" ]
              then
                      echo -e "您的系统是Linux"
              elif [ $var == "FreeBSD" ]
              then
                      echo -e "您的系统是FreeBSD"
              fi
      break
      done
      [root@localhost ~]# bash select.sh
      请选择系统类型?
      1) Linux
      2) GNU HURD
      3) FreeBSD
      4) Other
      
      #? 1
      您的系统是Linux
      
      
      #!/bin/bash
      
      declare -a serial
      serial=(1 2 3 4)
      PS3="Enter a number: "
      
      
      select var in "a" "b" "c" "d"
      do
          if ! echo ${serial[@]} | grep -q $REPLY
              then
                      echo "please enter [1-4]."
                      continue
          fi
      
              echo "your anwser is: $var"
              break
      done
      
      [root@localhost ~]# bash select.sh
      1) a
      2) b
      3) c
      4) d
      Enter a number: 1
      your anwser is: a
      

       

      FOR循环结构

      列表FOR循环: 循环打印数据分别从1遍历到5.

      do和done之间的命令称为循环体,执行次数和list列表中常数或字符串的个数相同.for循环,首先将in后list列表的第一个常数或字符串赋值给循环变量,然后执行循环体,以此执行list,最后执行done命令后的命令序列.

      #!/bin/bash
       
      for tmp in {1..5}
      do
           echo "Hello, Welcome $tmp times"
      done
      

      FOR循环累加: 通过FOR循环累加打印数据.

      通过i的按步数2不断递增,计算sum值为2500.同样可以使用seq命令实现按2递增来计算1~100内的所有奇数之和,for i in $(seq 1 2 100),seq表示起始数为1,跳跃的步数为2,结束条件值为100.

      #!/bin/bash
      sum=0
       
      for i in {1..100..2}
      do
          let "sum+=i"
      done
      
      echo "sum=$sum"
      

      FOR循环遍历目录: 通过for循环显示当前目录下所有的文件.

      #!/bin/bash
       
      for file in $( ls )
      #for file in *
      do
         echo "file: $file"
      done
      

      不带列表FOR: 由用户制定参数和参数的个数,与上述的for循环列表参数功能相同.

      #!/bin/bash
      
      echo "number of arguments is $#"
      echo "What you input is: "
      
      for argument
      do
          echo "$argument"
      done
      

      C风格FOR循环: 也被称为计次循环.

      #!/bin/bash
      for((integer = 1; integer <= 5; integer++))
      do
          echo "$integer"
      done
      

      实例1: 通过for循环打印1-10.

      [root@localhost ~]# cat for.sh
      #!/bin/bash
      
      for temp in `seq 1 10`
      do
              echo -e "打印数据: $temp"
      done
      

      实例2: 通过for循环计算1-100的累加和.

      [root@localhost ~]# cat for.sh
      #!/bin/bash
      
      declare -i sum=0
      
      for temp in `seq 1 100`
      do
              sum=$sum+$temp
      done
      
      echo -e "从1+到100的结果是: $sum"
      

      实例3: 从列表中选择数据.

      [root@localhost ~]# cat for.sh
      #!/bin/bash
      
      for temp in 1 3 5 7 9
      do
              echo -e "打印: $temp"
      done
      
      [root@localhost ~]# bash for.sh
      打印: 1
      打印: 3
      打印: 5
      打印: 7
      打印: 9
      

      实例4: 读取文件内容并打印.

      [root@localhost ~]# cat for.sh
      #!/bin/bash
      
      world=`cat /etc/passwd`
      for temp in $world
      do
              echo -e "打印: $temp"
      done
      

       

      WHILE 循环

      计数控制: 指定了循环的次数500,初始化计数器值为1,不断测试循环条件i是否小于等于100.在循环条件中设置了计数器加2来计算1~100内所有的奇数之和.

      #!/bin/bash
       
      sum=0
       
      i=1
       
      while(( i <= 100 ))
      do
           let "sum+=i"
           let "i += 2"   
      done
       
      echo "sum=$sum"
      

      结束标记控制的while循环: 设置一个特殊的数据值(结束标记)来结束while循环.

      #!/bin/bash
       
      echo "Please input the num(1-10) "
      read num
       
      while [[ "$num" != 4 ]]
      do 
         if [ "$num" -lt 4 ]
         then
              echo "Too small. Try again!"
              read num
         elif [ "$num" -gt 4 ]
         then
               echo "To high. Try again" 
               read num
         else
             exit 0
          fi
      done 
       
      echo "Congratulation, you are right! "
      

      标志控制的while循环: 使用用户输入的标志值来控制循环的结束(避免不知道循环结束标志的条件).

      #!/bin/bash
       
      echo "Please input the num "
      read num
       
      sum=0
      i=1
       
      signal=0
       
      while [[ "$signal" -ne 1 ]]
      do
          if [ "$i" -eq "$num" ]
          then 
             let "signal=1"
             let "sum+=i"
             echo "1+2+...+$num=$sum"
          else
             let "sum=sum+i"
             let "i++"
          fi
      done
      

      命令行控制的while循环: 使用命令行来指定输出参数和参数个数,通常与shift结合使用,shift命令使位置变量下移一位($2代替$1、$3代替$2,并使$#变量递减),当最后一个参数显示给用户,$#会等于0,$*也等于空.

      #!/bin/bash
      
      echo "number of arguments is $#"
      echo "What you input is: "
       
      while [[ "$*" != "" ]]
      do
          echo "$1"
          shift
      done
      

      while计算: 通过while循环,计算1-100的累加和.

      [root@localhost ~]# cat while.sh
      #!/bin/bash
      
      declare -i x=0
      declare -i num=0
      
      while [ "$x" -lt "100" ]
      do
              x=$x+1
              num=$num+$x
      done
      
      echo -e "从1-100结果是: $num"
      
      [root@localhost ~]# bash while.sh
      从1-100结果是: 5050
      

       

      Break跳出循环

      break: 在for、while和until循环中break可强行退出循环,break语句仅能退出当前的循环,如果是两层循环嵌套,则需要在外层循环中使用break.

      #!/bin/bash
       
      sum=0
      for (( i=1; i <= 100; i++))
      do 
          let "sum+=i"
       
          if [ "$sum" -gt 1000 ]
          then
              echo "1+2+...+$i=$sum"
              break
          fi
      done
      

      continue: 在for、while和until中用于让脚本跳过其后面的语句,执行下一次循环.continue用于显示100内能被7整除的数.

      #!/bin/bash
       
      m=1
      for (( i=1; i < 100; i++ ))
      do
          let "temp1=i%7"         #被7整除
       
          if [ "$temp1" -ne 0 ]
          then
              continue
          fi
          
          echo -n "$i  "
          
          let "temp2=m%7"          #7个数字换一行
          
          if  [ "$temp2" -eq 0 ]
          then
              echo ""
          fi
          
          let "m++"
      done
      

       

      FUNCTION函数

      实现一个无参数传递的函数.

      [root@localhost ~]# cat function.sh
      #!/bin/bash
      
      function my_print()
      {
              echo -e "------------------------"
              echo -e "hello world"
              echo -e "------------------------"
              return "127"
      }
      
      my_print
      echo $?
      
      [root@localhost ~]# bash function.sh
      ------------------------
      hello world
      ------------------------
      127
      

      简单实现参数的传递.

      [root@localhost ~]# cat function.sh 
      #!/bin/bash
      
      function my_print()
      {
          echo "参数1:" $1
          echo "参数2:" $2
          echo "参数3:" $3
      }
      
      test="1 2 3"
      my_print ${test}
      
      [root@localhost ~]# bash function.sh
      参数1: 1
      参数2: 2
      参数3: 3
      
      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://my.oschina.net/lyshark/blog/5550904,作者:LyShark,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:Python爬虫基础——04-流程控制语句

      下一篇:Python操作MySQL就是这么简单

      相关文章

      2025-05-14 10:33:25

      超级好用的C++实用库之网络

      在网络相关的项目中,我们经常需要去获取和设置设备的IP地址、子网掩码、网关地址、MAC地址等信息。这些信息一般与操作系统相关,在Windows系统和Linux系统上调用的接口是不一样的。

      2025-05-14 10:33:25
      Linux , 参数 , 地址 , 接口 , 网卡 , 返回值
      2025-05-14 10:03:13

      超级好用的C++实用库之线程基类

      在C++中,线程是操作系统能够进行运算调度的最小单位。一个进程可以包含多个线程,这些线程共享进程的资源,比如:内存空间和系统资源,但它们有自己的指令指针、堆栈和局部变量等。

      2025-05-14 10:03:13
      Linux , void , Windows , 函数 , 操作系统 , 线程
      2025-05-13 09:51:17

      使用Kernel 2.6版本的Linux系统运行dbca创建数据库实例时报错ORA-27125

      使用Kernel 2.6版本的Linux系统运行dbca创建数据库实例时报错ORA-27125

      2025-05-13 09:51:17
      dbca , Linux , ORA
      2025-05-12 08:40:18

      Linux+Docer 容器化部署之 Shell 语法入门篇 【Shell变量】

      Linux+Docer 容器化部署之 Shell 语法入门篇 【Shell变量】

      2025-05-12 08:40:18
      Linux , 变量
      2025-05-09 08:51:09

      Linux+Docer 容器化部署之 Shell 语法入门篇 【Shell 替代】

      Linux+Docer 容器化部署之 Shell 语法入门篇 【Shell 替代】

      2025-05-09 08:51:09
      Linux , Shell , var
      2025-05-09 08:51:09

      Linux+Docer 容器化部署之 Shell 语法入门篇 【Shell基本运算符】

      Linux+Docer 容器化部署之 Shell 语法入门篇 【Shell基本运算符】

      2025-05-09 08:51:09
      Linux , Shell , 语法 , 运算符
      2025-05-09 08:50:42

      Linux+Docer 容器化部署之 Shell 语法入门篇 【Shell条件语句】

      Linux+Docer 容器化部署之 Shell 语法入门篇 【Shell条件语句】

      2025-05-09 08:50:42
      Shell , 语句 , 语法
      2025-05-07 09:09:26

      【Linux 从基础到进阶】Linux中的用户认证与授权

      在Linux系统中,**用户认证(authentication)和授权(authorization)**是两个核心的安全机制,用来控制系统资源的访问和管理用户操作权限。用户认证确保登录的用户是合法的,授权则决定用户能够执行哪些操作。

      2025-05-07 09:09:26
      Linux , 密码 , 用户 , 认证
      2025-05-07 09:08:54

      【Linux】什么是Linux?

      【Linux】什么是Linux?

      2025-05-07 09:08:54
      Linux , 文件 , 权限
      2025-05-07 09:08:42

      Linux系统中Crontab的用法详解

      在Linux系统中,任务调度是管理系统定期执行任务的重要方式,而crontab则是实现这一功能的强大工具。

      2025-05-07 09:08:42
      crontab , Linux , 任务
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5265526

      查看更多

      最新文章

      超级好用的C++实用库之网络

      2025-05-14 10:33:25

      超级好用的C++实用库之线程基类

      2025-05-14 10:03:13

      shell编程-函数与流程控制详解(超详细)

      2025-04-18 07:10:53

      shell编程-重定向与打印命令详解(超详细)

      2025-04-18 07:10:44

      使用shell脚本在Linux中管理Java应用程序

      2025-04-18 07:10:44

      shell编程-变量与字符串详解(超详细)

      2025-04-18 07:10:44

      查看更多

      热门文章

      VB编程:获取对象私有域的地址-39

      2023-03-21 02:54:34

      Linux C网络编程 ————3、多进程服务器实现

      2023-04-23 09:44:23

      yum install nginx-没有可用软件包 nginx。

      2024-07-01 01:31:47

      在Linux系统中测试其他主机的端口是否能正常访问提示“telnet: connect to address 192.168.1.165: No route to host“

      2023-06-19 07:04:28

      Linux C网络编程 ————2、UDP网络编程

      2023-05-26 10:27:44

      Linux-SmartHome-QML-3-安装Git和Qt开发环境测试

      2024-09-25 10:15:32

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      Linux C网络编程 ————3、多进程服务器实现

      Java技术栈(总图)

      Linux Command dpkg 软件管理

      Linux C网络编程——域名解析服务器设计

      程序员之路:Linux链接命令

      Linux C网络编程 ————6、IO复用并发服务器编程

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号