偷得浮生半日闲——shell

 

学了一下午的shell脚本,记一记!

变量
  • 简单的分类,三种变量

    • 数字:整数、小数

    • 字符串:

      • ‘:变量在其中不起作用

      •  ”:没什么特殊的

      • 数组:元素可以是数字和字符串

  • 定义:

    a=12  
    b=1.3
    c=‘我学shell‘
    d="我学shell"
    e=(1 3 4 ‘我学shell‘) # 数组元素空格隔开
    # 变量名和值没有空格,没有空格,没有空格!
    error = "虽然我工整,但是我是错误的定义"  #错误定义
  • 使用

    #!/bin/sh # 基本操作,写上哈。
    a=1
    b=12.34
    c=‘我在学shell‘
    d="我在学shell"
    e=($a $b $c $d) # 非数组变量的使用
    f=(${a} ${b} ${c} ${d})
    ?
    echo ${e[*]}  # 数组的使用,
    echo ${f[*]}
    echo $f[*]    # 数据的错误使用
    ?
    error = "我很工整“
    ##########################################################
    上面脚本,下面结果
    ##########################################################
    root@chenmo-virtual-machine:/opt/work/stu_shell# sh 001.sh
    1 12.34 我在学shell 我在学shell
    1 12.34 我在学shell 我在学shell
    1[*]
    ?
    001.sh: 行 12: 寻找匹配的“"”时遇到了未预期的文件结束符
    001.sh: 行 14: 语法错误: 未预期的文件结尾
    • 非数组: $name or ${name},

    • 数组: ${array_name[n]}:

      • n为数字: 数组下标

      • n 为* @ ,整个数组

运算
  • 分类——百度

    • 算术

    • 关系

    • 逻辑

    • 布尔

    • 文件运算

  • 注意:

    • 记忆运算符字符

    • > < 是shell重定向运算符, 脚本中需要用 -gt -lt代替, 其他冲突的也一样。

语句
  • 基本语句:linux 命令

  • 流程语句:

    • 条件

      • if

        #!/bin/sh
        a=1
        ?
        if [ a == 1 ] # 1.注意空格,[] 与表达式
        then  # 2.条件判断后面有then
        echo 我是1
        elif [ a == 2 ] # 3.elif
        then
        echo 我是2
        else # 4.else
        echo 我不是1
        fi # 5.注意结束
        ############################################################
        上面脚本,下面结果
        ############################################################
        我是1
      • case

        #!/bin/sh
        # switch
        a=1
        case  $a  in  # 1.判断的对象
        1) echo 1 # 2.1可能的结果
        ;;
        2) echo 2 # 2.2可能的结果
        ;;
        3|4) echo 3 or 4 #2.3可能的结果
        ;;
        *) echo $a    #2.4没有匹配
        ;; # 3.注意他的出现
        esac # 4.收尾工作
        ############################################################
        上面脚本,下面结果
        ############################################################
        root@chenmo-virtual-machine:/opt/work/stu_shell# sh switch.sh
        1

        与C++ java不同,case不需要break

    • 循环

      • for

        for((i=1; i<10; i++ ));do      # 1.还有另一种方式  for i  in  {1..9}, 记得写do
        for((j=1; j<10; j++));do
        if [ $j -le $i ];then
        echo -e $j"X"$i"="$[i*j]"\t\c"
        fi
        done # 2.循环结束写 done
        echo ""
        done
        ########################### 输出 #######################################
        1X1=1
        1X2=2 2X2=4
        1X3=3 2X3=6 3X3=9
        1X4=4 2X4=8 3X4=12 4X4=16
        1X5=5 2X5=10 3X5=15 4X5=20 5X5=25
        1X6=6 2X6=12 3X6=18 4X6=24 5X6=30 6X6=36
        1X7=7 2X7=14 3X7=21 4X7=28 5X7=35 6X7=42 7X7=49
        1X8=8 2X8=16 3X8=24 4X8=32 5X8=40 6X8=48 7X8=56 8X8=64
        1X9=9 2X9=18 3X9=27 4X9=36 5X9=45 6X9=54 7X9=63 8X9=72 9X9=81

         

      • while

        #!/bin/bash
        ?
        #
        # while
        #
        ?
        a=3
        while [ $a -gt 0 ];do   # 1. while [ 条件判断 ] do
        echo  "while $a"
        a=$((a-1))
        done # 2.done
        root@chenmo-virtual-machine:/opt/work/stu_shell# sh while_01.sh
        while 3
        while 2
        while 1
      • until

        #!/bin/bash
        #
        # until
        #
        i=0
        sum=0
        ?
        until [ $i -gt 5 ]; do  # 1.until [ 判断条件 ]; do
        i=$((i+1))
        sum=$((sum+i))
        printf  "i: %-5d sum: %-5d\n" $i $sum
        done # 2.done
        root@chenmo-virtual-machine:/opt/work/stu_shell# sh util_001.sh
        i: 1     sum: 1    
        i: 2     sum: 3    
        i: 3     sum: 6    
        i: 4     sum: 10  
        i: 5     sum: 15  
        i: 6     sum: 21  

         

函数
  • 无参数函数

    #!/bin/sh
    #
    # 简单的没有参数的函数
    #
    myecho (){ # 函数的定义
    echo "hello, my first fun"
    }
    ?
    myecho  # 函数的调用
    ?
    root@chenmo-virtual-machine:/opt/work/stu_shell# sh fun_001.sh
    hello, my first fun

     

  • 有参数函数

    • 内部传参

      #!/bin/sh
      #
      # 简单的没有参数的函数
      #
      myecho (){ # 函数的定义
      echo "hello,$1岁的$2小伙$3! " # $1 第一个参数, $2第二个参数 。。。。。
      echo $* # $* ? 所有的参数
      } # $0 ? 文件名称,似曾相识?
      ?
      myecho 24 甘肃 陈墨 # 函数的调用, 函数名 参数1 参数2 参数3
      ?
      root@chenmo-virtual-machine:/opt/work/stu_shell# sh fun_002.sh
      hello,24岁的甘肃小伙陈墨!  
      24 甘肃 陈墨

       

    • 内部或外部传参

      #!/bin/sh
      #
      # 简单的没有参数的函数
      #
      myecho (){ # 函数的定义
      echo "hello,$1岁的$2小伙$3! "
      echo "$*"  
      }
      ?
      echo "命令行传入的参数: $* "
      ?
      if [ $# != 3 ];then    # 虽然$0是文件名称,和其他语言类似,但是shell $*不包含$0
      myecho 24 甘肃 陈墨 # 函数的调用
      else
      myecho $1 $2 $3
      fi
      ?
      # 外部不传入参数
      root@chenmo-virtual-machine:/opt/work/stu_shell# sh fun_003.sh  
      命令行传入的参数:  
      hello,24岁的甘肃小伙陈墨!  
      24 甘肃 陈墨
      # 外部传入参数
      root@chenmo-virtual-machine:/opt/work/stu_shell# sh fun_003.sh 22 clt gs
      命令行传入的参数: 22 clt gs
      hello,22岁的clt小伙gs!  
      22 clt gs

       

  • 有返回值函数

    #!/bin/bash
    #
    # 返回参数
    #
    ?
    add (){
    sum=$(($1+$2))
    return $sum
    }
    ?
    sub (){
    diff=$(($1-$2))
    return $diff
    }
    ?
    add $1 $2    
    echo "$1 + $2 =$?" # $? 上一个函数的返回值
    sub $1 $2
    echo "$1 - $2 =$?" # $? sub 函数执行后,$? == sub()
    root@chenmo-virtual-machine:/opt/work/stu_shell# sh fun_006.sh 45 12
    45 + 12 =57
    45 - 12 =33

     

 

 

偷得浮生半日闲——shell

上一篇:如何在Mac上的 iMovie 剪辑中将片段添加到影片?


下一篇:linux内核模块编译-通过Makefile重命名.ko文件名和模块名