中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Shell腳本基礎

發布時間:2020-07-08 15:53:05 來源:網絡 閱讀:215 作者:xiangjian0823 欄目:系統運維
什么是Shell

在Linux操作系統中,有兩個非常重要的工具:①Linux命令;②Shell。Linux命令是Linux系統對用戶提供的眾多系統功能接口,每一個Linux命令都能完成一個獨立的系統功能;Shell是一個基于C語言開發的應用程序,它可以通過各種邏輯語法和程序控制指令把一系列的Linux命令組合在一起,形成一個面向過程的程序命令(Shell Script)。

Linux命令一般需要在特定環境中執行,我們一般的Linux命令就是在Shell中執行的,需要特定的環境變量等支持;而Shell腳本會fork一個子進程去執行,如果在腳本中涉及環境變量的改變則只會改變子進程的環境,對Shell的環境變量沒有影響。

我們知道Linux的Shell是一個組合并執行Linux命令的應用程序,所以Shell的實現并不只有一種,我們常用的Shell類型包括:sh、C Shell、TCSH、bash。Linux中默認的Shell為bash,一般保存在/bin/bash

也就是說,Linux命令是系統提供的具備各種不同功能的命令集合、Shell是一個可以將多個Linux命令組合為Shell腳本的應用程序,相當于一個腳本解析器。

Shell腳本基礎


Shell腳本語法
  1. 在Linux中l腳本的第一行一般會向系統聲明該腳本所使用的解析程序:

    #!/bin/bash,通過這條語句聲明該腳本使用/bin/bash這個應用程序解析

  2. Shell腳本的基本表達式:

    表達式 功能
    ++、-- 自增、自減(與C語言的前后自增自減相同)
    +、-、*、/、% 加、減、乘、除、余運算
    ** 冪運算
    >、>=、<、<=、==、!= 比較運算
    <<、>> 按位左移、右移運算
    &、|、^ 與、或、異或運算
    &&、||、! 邏輯與、或、非
    exp?a:b 三目運算符
    #內容 單行注釋
    :<<EOF 內容 EOF 代表多行注釋(EOF可以使用單引號、感嘆號代替)
  3. 變量賦值:

    如何給變量賦值?如何調用變量?
    Shell的變量使用等于號賦值,且等號之間不允許有空格,必須要直接與等號相連v1="value"
    調用變量只需要將變量名連接在美元符號$后面v2=$v1,也可以使用大括號區分每個變量的邊界v3=${v1}isgood

      #直接進行變量賦值
      a=12      #默認是字符串類型的"12",進行數值運算時會解析為數值型的12
      b=str1        #默認是字符串類型的"str1"
    
      #使用單引號和雙引號進行變量賦值,雙引號會解析變量、轉義字符、反引號命令;而單引號則不會解析任何上面的東西,完全按照字符串字面值賦值。
      v="$a"    #這時變量v的值為12
      v='$a'    #這時變量v的值為'$a'
    
      #列表變量的賦值
      list=(v1,v2,v3)   #括號內為列表內容,中間使用空格分隔
      echo ${list[@]}   #通過${}來調用列表,[]內表示索引,[@]表示列表內的每一項

    注意使用以上方式的變量賦值,是無法進行任何命令以及運算的!,只能將變量解析出來,但是無法進行命令執行和數學運算。

      a=1
      b=2
      c="$a+$b"     #c的值為"1+2"而不是3
      d="ls -al"        #d的值為"ls -al"而不會執行
  4. 代換和Shell中的括號

    • 文件名代換

      簡單地說就是一種可以使用在文件名上的通配符:

      *    #表示匹配任意多個任意字符
      ?    #表示匹配一個任意字符
      []   #表示匹配中括號內任意一個字符的第一次出現
      
      cd ./test[123abc]        #匹配test1、test2、test3、testa...
    • 命令代換,單括號

      單括號符功能:①命令組功能,可以執行單引號中的多個命令;②命令代換,在變量中的命令會執行并正常輸出到標準輸出中;③初始化Shell列表變量
      注意區分變量環境和非變量的環境,只有變量的環境下需要在單括號外加美元符號

       #在變量中使用反引號或單括號,可以將變量解析為shell命令并執行:
       a=`ls -al` #反引號可以進行命令代換
       b=$(ls -al)    #美元括號的內容會進行命令代換
      
       (pwd)  #執行pwd命令
       `pwd`  #執行pwd命令
    • 運算代換,雙括號

      雙括號符功能:①數值運算功能,只要內符合C語言運算語法,即可進行數值運算;②運算代換,在變量中的數值運算會正常進行后再進行賦值;③for語句功能,雙括號可以在for循環中使用;
      注意區分變量環境和非變量環境,只有變量環境下需要在雙括號外加美元符號

       #在變量中使用雙引號,可以將變量解析為數值運算并執行:
       a=10
       b=$(($a+20))   #b的值為30
    • 中括號

      中括號功能:①Shell的內部命令,可用于進行條件測試返回True、False,等同于test命令;②正則表達式和通配符可以使用;③作為列表的索引使用

      要注意,作為條件測試的中括號是一個命令語句而不是一個符號。作為命令前中括號后需要帶一個空格才能接參數,而后中括號就是作為該條件測試命令的最后一個參數,代表參數輸入結束。前后中括號中間的值都作為命令的參數。
      并且作為一個命令,[在對開空格的字符串作處理時會發生問題。

       #if使用中括號條件測試,結果為輸出yes
       if [ 10 -lt 20 ] && [ 1 -lt 2 ]    #此處前中括號后和后中括號前都需要加一個空格
       then
          echo yes
       else
          echo no
       fi
      
       #這里$name會解析為三個字符串,導致[命令參數錯誤
       name="here and there"
       if [ -n $name ]    #使用[ -n "$name" ]才能正常
       then
          echo "not empty"
       fi
       #這里的結果會報錯  bash: [: too many arguments
    • 雙中括號

      雙中括號功能:①bash的內部關鍵字,能完成[的加強版功能,并且因為[[不是命令而是關鍵字,所以對參數的解析規則會略有不同。且與[每次只能做一種判斷不停,[[可以使用&&、||等運算符,可以同時做多種比較。

        #if使用中括號條件測試,結果為輸出yes
       if [[ 10 -lt 20 && 1 -lt 2 ]]  #此處前中括號后和后中括號前都需要加一個空格
       then
          echo yes
       else
          echo no
       fi
      
       #因為對參數的處理不同,可以直接處理帶空格的字符串
       name="this is a test"
       if [[ -n $name ]]
       then
          echo "not empty"
       fi
       #結果會正常顯示
    • 大括號

      大括號功能:①可以對文件名做擴展,作用類似通配符;②執行代碼塊,就是C中的代碼塊,每條命令結束都要加分號;③分隔變量名稱和使用列表變量

       touch test{1..5}.txt   #會創建5個文件,其實就是通配符嘛
      
       a="${this}IsATest" #不使用大括號變量名會粘在一起
       a="${list[@]}"     #選擇列表所有元素
  5. Shell中的特殊字符

    Shell中的字符都有許多特殊的用法:

    特殊字符 功能
    ; 分號,表示連續執行命令
    exp & 句尾的&號,表示命令在后臺執行
    n&>file 重定向,將文件符n重定向到目標文件
    exp1 && exp2 兩個命令中間的&&,表示exp1返回0才會執行exp2
    exp1 || exp2 兩個命令中間的||,表示exp1返回非0才會執行exp2
    ${#var} 返回列表或變量的長度
    $0、$1、$2 和運行腳本的命令有關。0表示該腳本文件;1、2分別表示第1、2個參數
    $*、$@、$# 和運行腳本的命令有關。*和@表示參數列表;#表示參數個數
    $$、$? 和運行腳本的命令有關。\$表示腳本運行PID;?表示腳本退出碼

Shell流程控制
  1. if語句

      #可以寫成正常形式
      if condition1
      then
        cmd1
      elif condition2
      then
        cmd2
      else 
        cmd3
      fi
    
      #也可以寫成一句話形式,中間用分號連接
      if condition1; then cmd1; elif condition2; then cmd2; else cmd3; fi
  2. for語句

      #正常形式
      for var in ${list[@]}
      do
        cmd1
        cmd2
        cmd3
      done
    
      #一句話形式,中間用分號分隔
      for var in ${list[@]}; do cmd1; cmd2; cmd3; done
  3. while語句

    while語句是先判斷條件再執行循環,且條件為False時結束循環,同C語言

      #正常形式
      while condition
      do
        cmd1
        cmd2
      done
    
      #一句話形式,中間用分號分隔
      while condition; do cmd1; cmd2; done
  4. until語句

    until語句是執行函數后再判斷條件,且條件為True時結束循環,同C語言

      until condition
      do 
        cmd1
        cmd2
      done
    
      until condition; do cmd1; cmd2; done
  5. case語句

      a=2
      case $a in
      1)
        cmd1
        ;;
      2)
        cmd2
        ;;
      *)
        cmd3
        ;;
      esac
    
      #一句話形式
      a=2
      case $a in 1) cmd1;; 2) cmd2;; *) cmd3;; esac
  6. 跳出循環

    可以在循環語句for、while、until以及枚舉語句case中,使用break終止整個流程;使用continue跳過本次流程。此處與C語言相同。


Shell函數

Shell可以定義函數,之后可以隨意調用。

funName(){  #定義函數,后面不用帶參數,傳參方法和命令相似
    (ls -al $1)
    echo $2

    i=$3
    while [ $i -gt 0 ]
    do
        echo $i
        i=$(($i-1))
    done
}

funName /usr this 3 #調用函數,后面是參數

新手發文,歡迎大佬指正錯誤

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

自治县| 长阳| 龙山县| 天台县| 达拉特旗| 文安县| 兴海县| 云安县| 油尖旺区| 宁陕县| 牟定县| 徐闻县| 西乌珠穆沁旗| 仙游县| 云阳县| 庄河市| 湖口县| 乐至县| 吴忠市| 民丰县| 合水县| 阿勒泰市| 康平县| 化德县| 松桃| 凤庆县| 邛崃市| 阳谷县| 吉安县| 富川| 昭平县| 密山市| 富锦市| 乌拉特中旗| 房产| 澎湖县| 宜阳县| 塘沽区| 韩城市| 巴青县| 永清县|