Shell脚本

shell的特殊字符

  1. |

    • 作用:管道
    • 示例
      • forune | lolcat
  2. `  `
        作用:命令置换:
        示例:
        	echo `ls`    (echo 在终端显示)
    

    image-20230314144510596

  3. >> 输出重定向
     	> 覆盖输入
    	>> 最佳输入
    	示例:
    		echo Hello world >> 1.c
    
  4. 通配符

    • *:匹配所有字符
    • {起始…结束} 创建连续的文件
    • [ ]
      • rm [13579].c 删除了1.c 2.c 3.c 4.c 5.c
      • rm [1-5].c 删除了1-5.c
    • ?:匹配一个字符串
    • [^ ]:删除除了指定的文件,只能通配一个

⭐️ shell脚本

  1. 本质:shell命令的有序集合

  2. bash解释器

    • 作用:指向.sh脚本
  3. 编写shell脚本

    1. 创建一个.sh的文件
    2. 写shell命令
    3. 执行
      • 通过bash这个解释器来执行
      • 通过./来执行,但是需要有执行权限,使用chmod来给文件提权
  4. 示例

    #!/bin/bash    //第一行一般都这样写,表示解释器的路径
    cp ../1.c 1.c
    cp ../2.c 2.c
    >> 1.c Hello world
    

    shell中0表示真,1表示假

  5. shell变量

    1. 自定义变量

      • 没有数据类型,默认为字符串类型

      • 赋值不能隔开

      • 变量名=值

      • 没有分号,换行相当于分号

      • 变量的调用需要加$

        #!/bin/bash
                             
        a=2
        echo $a
        
    2. 位置变量

      • 命令行参数的变量,从终端传递参数给shell脚本
      • 从$0开始到9如果要打印9以后的变量需要加{ },例如{12}
    3. 环境变量

      • 计算机定义好的变量
      • env可以查看所有环境变量
      • 调用需要加$
    4. 预定义变量

      • 计算机给出一些特殊变量赋予特殊意义

      • 格式 描述
        $# 传递到脚本的参数个数
        $* 以一个单字符串显示所有向脚本传递的参数。
        如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
        $$ 脚本运行的当前进程ID号
        $! 后台运行的最后一个进程的ID号
        $@ *相同,但是使用时加引号,并在引号中返回每个参数。<br/>如"@“用「”」括起来的情况、以"$1" “2" … "n” 的形式输出所有参数。
        $- 显示Shell使用的当前选项,与set命令功能相同。
        $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
  6. 变量的四则运算

    1. ( () )

      • 不能进行浮点运算
      • 调用的时候要加钱$
      • 可以进行幂数运算
      #!/bin/bash
      
      a=$((3**3))
      echo $a 
      结果为27
      
    2. [ ]

      • 不能进行浮点运算
      • 调用的时候要加钱$
      • 可以进行幂数运算
      #!/bin/bash
      
      a=$[ 3+3]
      echo $a 
      结果为6
      
    3. expr

      • 需要命令置换符置换出来结果
      • 算数之间需要空开
      • 当进行乘法的时候需要用\区分,其他都不需要
      #!/bin/bash
      
      a='expr 1 \* 2'
      a='expr 1\*2'//报错 需要空开
      echo $a 
      结果为2
      
    4. 练习

      • 交换a,b的值
      #!/bin/bash
      a=$[ 3 * 3 * 3]
      b=$((5*7))
      c=$a
      a=$b
      b=$c
      echo  a=$a b=$b >> 1.txt
                                          
      
  7. Shell语句

    • 字符串比较

      • test 字符串1 = 字符串2 ---- 比较两个字符串是否相等
      • test 字符串1 != 字符串2 ---- 比较两个字符串是否不相等
      • test -z 字符串 ---- 判断字符串为不为空
      • test -n 字符串 ---- 判断字符串是否为不空
      #!/bin/bash
      
      a="hello"
      b="hello"
      test $a != $b
      test -z $a
      test -n $a
      echo $?  //?表示上一个结果
      
    • 整数比较

      • -eq ---- 等于
      • -ne ---- 不等于
      • -gt ---- 大于
      • -lt ---- 小于
      • -ge ---- 大于等于
      • -le ---- 小于等于
      #!/bin/bash
      
      test 23 -eq 32
      echo $?  #?表示上一个结果
      结果 1    #shell中1表示假,0表示真
      
    • 文件比较

      • -e 文件 ---- 判断文件是否存在
      • -f 文件 ---- 判断文件是否为普通文件
      • -L 文件 ---- 判断文件是否为链接文件
      • -S 文件 ---- 判断文件是否为套接字文件
      • -b 文件 ---- 判断文件是否为块文件
      • -c 文件 ---- 判断文件是否为字符文件
      • -d 文件 ---- 判断文件是否为目录文件
      #!/bin/bash
      
      test -d $1 #$1表示从命令行去获取参数
      echo $?  #?表示上一个结果
      
      • -p 文件 ---- 判断文件是否为管道文件

      • 文件1 -nt 文件2 ---- 判断文件1是否比文件2新(时间戳)

      • 文件1 -ot 文件2 ---- 判断文件1是否比文件2旧(时间戳)

      • -o ---- 或 or

      • -a ---- 与 and文件权限

      #!/bin/bash
      
      test -d $1 -o -f $2 #$1 $2表示从命令行去获取参数
      echo $?  #?表示上一个结果
      
      • -r ---- 判断文件是否有可读写权限
      • -w ---- 判断文件是否有可写权限
      • -x ---- 判断文件是否有可执行权限
    • read ----- 把终端上的输入传给参数

      • 用法 :read 变量1 变量2 …
      • 参数:
        • read -p “提示” 变量名 ---- 给出提示
        • read -t 时间(秒) 变量名 ---- 超过时间自动停止
        • read -n 数字 变量名 ---- 显示输入的个数,超出个数也会自动结束
        • read -s ---- 隐藏输入,不显示
  8. 控制语句

    1. if

      • 第一种
      if []
      then
      	shell 语句;
      fi
      #注意 if 和[]中需要加空格
      
      • 第二种
      if test语句
      then
      	shell 语句;
      fi
      #注意 if 和[]中需要加空格
      
    2. if -elif -else

      #!/bin/bash
      read a
      if test -e $a
      then
          if test -w $a
          then 
              echo "hello World" >> $a
          else
              chmod u+w $a
              echo "hello World" >> $a
          fi
      else
          touch $a
          chmod u+w $a 
          echo "hello World" >> $a
      fi
      
    3. case

      case 表达式 in
      	值1)
      		语句1
      	;;
      	值2)
      		语句2
      	;;
      	.
      	.
      	.
      	*)
      		语句n
      esac
      		
      
    4. while

      while 表达式
      do
      	shell语句
      done
      
      ((a--)) --->表示自减
      #示例
      #!/bin/bash   
        a=5
        while test $a -gt 0
        do
            ((a--))
            echo $a
        done
      
      • 死循环

        while true
        do
        	shell语句
        done
        
    5. for

      • 方式一
      for((表达式1;表达式2;表达式3))
      do
      	shell语句
                                                                              
      done
      #示例
      !/bin/bash 
      i=5
      for((i=0;i<5;i++))
      do
      	echo $i
      done
      
      • 方式二

        for 变量 in 单词表
        do
        	shell语句
        done
        #示例
        #!/bin/bash
        
        i=5
        for i in he li oi asda adsa ada ad
        do
            echo $i
        done
        
      • 方式三----连续的

        • for 变量 in {起始…结束}
         1 #!/bin/bash
         i=5
         for i in {a..z}
         do
             echo $i
         done
                                                        
        
        • for 变量 in
         #!/bin/bash
         i=5
         for i in `ls`
         do
            echo $i
         done
                                                        
        
  9. shell数组

    • shell脚本中只有一维数组
    • 没有数据类型
    #声明 :数组名=(元素1 元素2 元素3...)
    arr=(hello world nihao shijie)
    echo ${arr[0]}
    
    • 遍历数组

      arr=(hello world nihao shijie)
      echo ${arr[*]}
      echo ${arr[@]}
      
    • 求数组的长度

      arr=(hello world nihao shijie)
      echo ${#arr[*]}
      结果是4
      
    • 练习---- > 交换数组

      #!/bin/bash
                                                                  
      arr=(hello world chengdu sichuan asss)
      right=$[${#arr[*]} - 1]
      left=0
      temp=0
      while (test ${left} -le ${right})
      do
          temp=${arr[left]}
          arr[left]=${arr[right]}
          arr[right]=$temp
          ((left++))
          ((right--))
      done
      echo ${arr[*]}
      

      练习:求1到100的和

       #!/bin/bash
      sum=0
      i=5
      for((i=0;i<101;i++))
      do
           sum=$(($sum+$i))
      done
      echo "sum=$sum"
      #!/bin/bash 
      sum=0
      i=5
      for((i=0;i<101;i++))
      do
          sum=`expr $sum + $i`
      done
      echo "sum=$sum"
      
  10. shell 函数

    • 没有数据类型

    • 没有写形参,但是可以传参

    • 只有调用函数后,里面的东西才会生效

    • 定义:

      #第一种
      funtion 函数名()
      {
      	return 返回值
      }
      #第二种
      函数名(){
      	return 返回值
      }
      
    • 调用:直接函数名

    • 获取返回值 : $?

    • 函数的传参

      • 函数名 实参1 实参2…
      • 函数体中用$1, $2, 3...{15}来接收