shell

  • [ 解析器 和 调用 ]
    • 文件首行指定解析器,默认解析器可省略不写
    • 通过 sh 或者 bash 命令调用 shell 脚本
      // hello.sh
      #!/bin/bash
      echo "hello world"
    
      // run
      $ sh hello.sh
    
    • 给脚本文件添加执行权限后,调用时可省略 sh 或者 bash
      $ chmod 777 hello.sh
      ./hello.sh
    

  • [ 变量 ]
  • [ 常用的系统变量 ]
    • $HOME
    • $PATH
    • $PWD
    • $USER

  • [ 自定义变量 ]
    • A=1 // 直接定义复制,等号两侧不能有括号
    • echo $A // 调取变量时需要用 $ 符号
    • 变量区分大小写
    • unset A // unset 命令可以释放变量
    • readonly X=123 // readonly 定义静态变量,该变量无法被重新赋值,无法被释放
    • export D // 将变量 D 提升为全局变量

  • [ 特殊变量 ]
    • $n // n 为数字,$0 代表脚本自身,$1-9 代表前9个参数,大于9的需要用大括号包裹数字,如 $
    • $# // 代表输入参数的个数,不包括 $0 ,例如 sh hello.sh 1,这里的 $# 就为 1
      // hello.sh
      echo $#
      // run
      $ sh hello.sh a b c // 3
    
    • $* 和 $@,都表示所有参数,区别在于,用双引号包裹起来后,"$*" 会成为一个整体,而 "$@" 仍然可以用来遍历
    • $$ 获得当前进程 ID
    • $! 获得之前(上一个)进程 ID
    • $? 获得之前(上一个)进程结束的状态码 (0 表示成功, 1 表示失败)

  • [ 运算符 ]
    • $[运算式] || $((运算式))
      // cals.sh
      a=$[1+2]
      b=$[(1+2)*2]
      c=$((2+2))
    

  • [ 条件判断 ]
    • [ 条件语句 ] // 中括号内必须有首尾空格
    • [ 23 -eq 22 ] // 运算符两侧必须有空格
    • 整数比较
      = // 等于
      -lt // less than <
      -le // less equal <=
      -eq // equal =
      -gt // greater than >
      -ge // greater equsl >=
      -ne // not equal !=
      [ a -eq b ]
    
    • 字符串判断
      -z // 空字符串
      -n // 非空字符串
      == // 字符串相等
      != // 字符串不等
    
    • 文件权限判断
      -r // read 有读取权限
      -w // write 有写入权限
      -x // execute 有执行权限
      [ -w file ]
    
    • 文件类型判断
      -e // existence 文件存在
      -f // file 文件存在
      -d // directory 目录存在
      [ -d xxx ]
    
    • 多重判断
      -a // and 与
      -o // or 或
      ! // not 非
    
    • 使用 [[]] 或 (()) 包裹条件表达式,可以使用 > && 之类的符号

  • [ 流程控制 ]
  • [ if ]
    • 两种写法
      // 1 
      if [ 表达式 ]:then // 注意 if 后面的空格
        // code...
      elif [ 表达式 ]:then
      fi
    
      // 2
      if [ 表达式 ]
        then
        // code...
      elif [ 表达式 ]
        then
        // code...
      fi
    

  • [ case ]
  •   case $var in
        value1)
          // code 1
          ;;
        value2)
          // code 2
          ;;
        *)
          // code default
          ;;
      esac
    

  • [ for ]
  •   for((i=0; i<4; i++))
      do
        echo $i
      done
    

  • [ for in ]
    • 这里使用 $* 和 $@ 是一样的
    • 这里只能使用 "$@",而不能使用 "$*",因为后者会把所有参数合并到一起
      for i in $@
      do
        echo $i
      done
    

  • [ while ]
  •   i=0
      while [ $i -lt 5 ] // 注意 while 后面要有 空格
      do
        echo $i
        i=$[$i + 1]
      done
    

  • [ 控制台交互 ]
  • [ read ]
    • read [option] [var_name]
    • option:
      -p // 等待输入前给终端的提示内容
      -t // 等待输入的时间
    
    • var_name 将读取值赋值到的变量的变量名
      name=""
      echo ""
      read -t 2 -p "请输入姓名: " name
    # if [ -n "$name" ] // 注意这里给 $name 包裹了双引号
      if [ "$name" ] // 简写了,空字符串返回 false
        then
          echo "您的姓名是 $name"
        else
          echo ""
          echo ""
          echo "   ( 0 ^ 0 )  "
          echo "  (<  >^<  >) "
          echo ""
          echo "您没有输入姓名哦"
          echo ""
      fi
    

  • [ 函数 ]
  • [ 系统函数 ]
    • basename 获取不包含路径的文件名
    • dirname 获取不包含文件名的路径

  • [ 自定义函数 ]
    • 函数必须先定义才能被调用
      a=0
      b=0
      function sum()
      {
        a=$1
        b=$2
        s=$[$1+$2]
        return $s
      }
      sum 2 3
      result=$?
      echo "$a + $b 的结果为 $result"
    
    posted @ 2024-04-02 12:07  anch  阅读(6)  评论(0编辑  收藏  举报