shell

anch發表於2024-04-02

  • [ 解析器 和 呼叫 ]
    • 檔案首行指定解析器,預設解析器可省略不寫
    • 透過 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"
    

    相關文章