1. 程式人生 > 其它 >shell簡單入門

shell簡單入門

shell 入門

  • 指令碼格式

    #!/bin/bash
    
  • 第一個shell指令碼

    1. 建立一個shell指令碼,輸出 hello world

    2. 示例

    #!/bin/bash
     
    echo "hello world"
    
    1. 指令碼常用的執行方式
    sh test.sh
    bash test.sh
    ./test.sh
    source test.sh
    

系統變數

  • 系統變數

    $HOME   # 獲取家目錄地址
    $PWD    # 獲取當前的路徑
    $SHELL  # 獲取當前使用的shell直譯器
    

自定義變數規則

  1. 變數名可以由字元、數字和下劃線組成, 但是不能以數字開頭,環境變數建議大寫。
  2. 等號的兩側不能有空格
  3. bash中預設的變數都是字串型別,所以無法直接進行數值運算。
  4. 變數的值如果有空格,需要使用雙引號或者單引號括起來。
  • 宣告變數

    注意:等號的左右時沒有空格的

    # 宣告變數 A 和 B
    A=1
    B=2
    
  • 獲取變數

    使用 $ 符號

    # 獲取變數
    $A
    $B
    
  • 宣告靜態變數 readonly

    靜態變數,只能讀取,不能進行重新賦值和刪除

    # 宣告靜態變數
    readonly C=1
    # 讀取靜態變數
    echo $C
    

特殊變數

  • ${n}

    n 為數字,$0 代表指令碼名稱,$1代表第一個引數,依此類推。

    如果引數的個數超過9個,則需要加{} ,例如 ${10}

    #!/bin/bash
    
    echo "$0 $1 $2 $3"
    
    ./test.py 1 2 3
    
  • $#

    獲取傳入引數的個數, 一般用於迴圈

    #!/bin/bash
    
    echo "引數的個數:"$#
    
    ./test.py 1 2 3 4 5 6 7 8
    
  • $*

    獲取命令列中的所有的引數,會把所有的引數當成一個整體

    #!/bin/bash
    echo $*
    
  • $@

    獲取命令列中的所有的引數,但會將引數區別對待

    #!/bin/bash
    echo $@
    
  • $?

    最後一次執行命令的返回狀態,這個變數值為0,證明上一次執行的命令是正確的,如果這個值為非0,則證明上一次執行的命令是錯誤的。

    #!/bin/bash
    cat ./b.txt
    echo $?
    

運算子

  • 基本語法

    1. $((運算表示式)) 或者 $[運算表示式]
    2. expr +(加法),-(減法),\*(乘法),/(除法),%(取餘),expr 運算子間有空格
  • 示例

    • 計算 3+2的值

      root@win:~# expr 2 + 3
      5
      
    • 計算 3-2的值

      root@win:~# expr 3 - 2
      1
      
    • 計算 (2+3)*4的值

      root@win:~# expr `expr 2 + 3` \* 4
      20
      
    • 使用 $ 計算, 使用 () 需要有至少兩層,例如 $((表示式))

      root@win:~# echo $(((2+3)*4))
      20
      
      root@win:~# echo $[2+3]
      5
      

條件判斷

  • 基本語法

    • 語法

      [ condition ]
      
    • 注意事項

      1. 條件前後要有空格,條件為空則為false, 否則為true
  • 比較符號

    • = 字串等於

    • -lt 小於

    • -gt 大於

    • -eq 等於

    • -le 小於等於

    • -ge 大於等於

    • -ne 不等於

    • 示例

      # 判斷 23 大於等於 22
      root@win:~# [ 23 -ge 22 ]
      root@win:~# echo $?
      0
      
      # 判斷 23 大於等於 24
      root@win:~# [ 23 -ge 24 ]
      root@win:~# echo $?
      1
      
  • 按照檔案許可權進行判斷

    • -r 有讀的許可權

    • -w 有寫的許可權

    • -x 有執行的許可權

    • 示例

      # 檢視檔案
      qiang@win:~$ ll
      -rw-rw-rw- 1 qiang qiang    0 Jul 11 15:37 a.txt
      -rwxr-xr-x 1 root  root    34 Jul 11 09:54 helloworld.sh*
      
      # 判斷 helloworld.sh 是否有讀的許可權(有)
      qiang@win:~$ [ -r helloworld.sh ]
      qiang@win:~$ echo $?
      0
      
      # 判斷 a.txt 是否有執行的許可權(無)
      qiang@win:~$ [ -x a.txt ]
      qiang@win:~$ echo $?
      1
      
  • 按照檔案型別進行判斷

    • -f 檔案存在,並且是一個常規的檔案

    • -e 檔案存在

    • -d 目錄存在

    • 示例

      # 判斷一個檔案是否存在 (存在)
      qiang@win:~$ [ -f a.txt ]
      qiang@win:~$ echo $?
      0
      # 判斷一個檔案是否存在 (不存在)
      qiang@win:~$ [ -f b.txt ]
      qiang@win:~$ echo $?
      
      # 判斷b.txt是一個目錄 (不是)
      qiang@win:~$ [ -d b.txt ]
      qiang@win:~$ echo $?
      1
      # 建立目錄c並且判斷c 是一個目錄(是)
      qiang@win:~$ mkdir c
      qiang@win:~$ [ -d c ]
      qiang@win:~$ echo $?
      0
      
  • 多條件判斷

    • && 表示前一條命令執行成功時,才執行後一條命令,如果前一條命令執行失敗,則後面命令不會執行。

    • || 表示前一條命令執行成功時,就不會執行後一條命令。如果前一條命令執行失敗,才會執行後一條命令

    • 示例

      # 判斷22大於21為真,然後echo ok為真, 不執行或語句
      qiang@win:~$ [ 22 -gt 21 ] && echo ok || echo success
      ok
      # 判斷22大於21為假,不執行echo ok語句, 執行或語句,輸出 success
      qiang@win:~$ [ 22 -gt 23 ] && echo ok || echo success
      success
      

條件分支

  • if 語句

    • 基本語法

      # 第一種方式
      if [ 條件表示式 ];then
      	程式
      fi
      
      # 第二種方式
      if [ 條件表示式 ]
      then
      	程式
      fi
      
    • 示例

      #!/bin/bash
      
      if [ $1 -eq 1 ]
      then
              echo "輸入的引數是1"
      elif [ $1 -eq 2 ]
      then
              echo "輸入的引數是2"
      else
              echo "輸入錯誤"
      fi
      
      #!/bin/bash
      
      if [ $1 -eq 1 ];then
              echo "輸入的引數是1"
      elif [ $1 -eq 2 ];then
              echo "輸入的引數是2"
      else
              echo "輸入的引數有誤"
      fi
      
    • 注意事項

      1. [ 條件表示式 ] ,中括號與條件表示式中間必須有空格
      2. 要有 fi 結尾
  • case 語句

    • 基本語法

      case 
      
    • 注意事項

      1. case 行結尾為單詞 in , 每一個模式匹配符必須以) 結束。
      2. 1) 裡面的值最好是字串型別。
      3. 雙分號;; 表示命令序列結束。相當於 break
      4. *) 表示預設模式,相當於 default
      5. 預設模式 ;; 可寫可不寫,推薦 寫
    • 示例

      #!/bin/bash
      
      case $1 in
      "1")
              echo "python"
      ;;
      "2")
              echo "java"
      ;;
      "h")
              echo "h"
      ;;
      *)
              echo "others"
      ;;
      esac
      

迴圈語句

  • for 迴圈

    • 基本語法

      for ((初始值; 迴圈控制條件;步長))
      	do
      		程式
      	done
      	
      for 變數 in 值1 值2 值3
          do
      	    程式
          done
      
    • 注意事項

      1. for(()) 要有兩個括號
      2. 程式需要在 dodone 之間
    • 示例

      #!/bin/bash
      # 計算1到100的和
      sum=0
      for ((i=1;i<=100;i++))
      do
              sum=$(($sum+$i))
      done
      
      echo $sum
      
      
      
      #!/bin/bash
      # 獲取引數並列印,$@和$*效果是一樣的
      for i in $@
      do
              echo $i
      done
      for i in $*
      do
              echo $i
      done
      
      # 獲取引數並列印,“$@”和“$*”效果是不一樣的
      # "$@" 和上面的是一樣的,也是分別列印
      # "$*" 和上面的不一樣了,他是作為一個整體輸出的
      
      for i in “$@”
      do
              echo $i
      done
      for i in “$*”
      do
              echo $i
      done
      
      
  • while 迴圈

    • 基本語法

      while [ 條件表示式 ]
      do
      	程式
      done
      
    • 注意事項

      1. 條件表示式兩邊需要有空格
      2. 程式必須在 dodone 中間
      3. 程式必須有限制條件,否則會造成死迴圈
    • 示例

      #!/bin/bash
      # 計算1加到100的和
      i=1
      sum=0
      while [ $i -le 100 ]
      do
          # 累加的和
          sum=$[$sum+$i]
          # 限制條件
          i=$[$i+1]
      done
      
      echo $sum
      

讀取控制檯的輸入

  • read

    • 基本語法

      read -t 讀取資料的時間 -p "提示語句" 接收資料的變數
      
    • 注意事項

      1. -p 指定讀取值的提示符
      2. -t 指定讀取時等待的時間,預設單位秒。如果超出時間,則退出程式
      3. 需要有一個接收資料的變數
    • 案例

      #!/bin/bash
      # 20s 內輸入資料,用Name來接收資料,並列印
      read -t 20 -p "input your name"  Name
      echo $Name
      

函式

  • 系統函式

    • basename

      功能:獲取檔案的名稱

      # 獲取檔名稱
      qiang@win:~$ basename /home/qiang/case.sh
      case.sh
      
      # 獲取檔名稱,不帶字尾
      qiang@win:~$ basename /home/qiang/case.sh  .sh
      case
      
    • dirname

      功能: 獲取檔案的絕對路徑

      # 獲取檔案的絕對路徑
      qiang@win:~$ dirname /home/qiang/case.sh
      /home/qiang
      
  • 自定義函式

    • 基本語法

      [function] funcname[()]
      {
      	程式
      	[return int;]
      }
      
      funcname
      
    • 注意事項

      1. 先宣告函式,然後才可以呼叫
      2. 函式的返回值,只能使用$? 來呼叫,可以顯示條件return int,如果不加,則預設最後條命令執行的結果作為返回值。 return返回值的範圍在0~255之間
    • 示例

      #!/bin/bash
      # 定義求和函式
      function add()
      {
          sum=$[$1+$2]
          echo $sum
      }
      
      read -p "請輸入第一個引數: " p1
      read -p "請輸入第二個引數: " p2
      
      add $p1 $p2