什麼是Shell?快速入門上手Shell!

Shell是一個命令行解釋器,它接受應用程序/用戶命令,然後調用操作系統內核。是一個功能強大的編程語言,易編寫、易調試、靈活性高。
在這裏插入圖片描述
Linux提供的Shell解析器有六種:cat /etc/shells

  • /bin/sh
  • /bin/bash,在CentOS中默認解析器爲bash
  • /sbin/nologin
  • /bin/dash
  • /bin/tcsh
  • /bin/csh

腳本格式

  • 腳本以#!/bin/bash開頭

    #!/bin/bash
    
    echo "hello world"
    
  • 運行腳本文件可通過:sh xx.shbash xx.sh./xx.sh(注意需要.sh具備執行權限[x],chmod 777)

  • 通過touch xx.sh創建腳本文件,通過vim xx.sh編輯腳本文件。

系統變量

  • $HOME,當前登錄用戶的home目錄
  • $PWD,當前所在目錄路徑
  • $SHELL,默認shell解析器
  • $USER,當前登錄用戶

自定義變量

  • 基本語法
    • 定義變量:變量=值
    • 撤銷變量:unset 變量名
    • 聲明靜態變量:readonly 變量名,注意不能撤銷靜態變量,重啓即無效。
    • 變量定義規則:字母、數字、下劃線組成,不能以數字開頭,建議環境變量大寫。
    • 等號左右無空格,嚴格要求
    • 變量默認爲字符串類型,無法直接進行數值運算。
    • 變量的值若有空格,需要用引號括起來
    • 將腳本中的局部變量,提升爲全局變量:export 變量名

特殊變量

  • $n

    • 功能描述:n爲數字。$0,代表該腳本名稱;$1-$9,代表第一到第九個參數;第十以上的參數需要用${10}表示。

      touch partmeter.sh

      vim partmeter.sh

      #!/bin/bash
      
      echo "$0 $1 $2"
      

      bash partmeter.sh p1 p2

      partmeter.sh p1 p2

  • $#

    • 功能描述:獲取所有輸入參數個數,常用於循環

      #!/bin/bash
      
      echo "$#"
      

      bash partmeter.sh p1 p2

      2

  • $*

    • 功能描述:獲取命令行中所有的參數,將所有入參看做一個整體

      #!/bin/bash
          
      echo "$*"
      

      bash partmeter.sh p1 p2
      p1 p2

  • $@

    • 功能描述:獲取命令行中所有的參數,將所有入參區分對待

      #!/bin/bash
      
      echo "$@"
      

      bash partmeter.sh p1 p2
      p1 p2

  • $?

    • 功能描述:最後一次執行命令的返回狀態。若變量值爲0,證明上一次命令執行正確;若變量值爲非零,證明上一個命令執行出現錯誤。

運算符

  • 基本語法
    • $((運算式))$[運算式]
    • expr 運算(運算符之間必須有空格
      • +,加
      • -,減
      • \*,乘
      • /,除
      • %,取餘
      • 運算執行符號:`expr 2 + 3

條件判斷

  • 基本語法
    • [ condition ]注意表達式前後需要有空格
    • [ test ],條件非空即爲true;[],條件爲空即爲false;
  • 常用判斷條件
    • = 字符串比較
    • -lt,小於
    • -le,小於等於
    • -eq,等於
    • gt,大於
    • ge,大於等於
    • ne,不等於
    • -r,有讀的權限
    • -w,有寫的權限
    • -x,有執行的權限
    • -f,文件存在且是一個常規文件file
    • -e,文件存在
    • -d,文件存在且是一個目錄directory
  • 多條件判斷
    • &&,前一條命令執行成功時,才執行後一條命令
    • ||,前一條命令執行失敗時,才執行後一條命令

流程控制

if
  • 基本語法:if後要有空格,條件表達式[]前後必須有空格;elif,代表else if;fi結尾。

    #!/bin/bash
    
    if [ condition1 ];then
        content1
    elif [ condition2 ]
    then
        content2
    fi
    
case
  • 基本語法:case $變量名 in value)格式,;;case結尾,類似break;*)代表default分支;esac結尾;

    #!/bin/bash
    
    case $1 in
    1)
    	content1
    	;;
    2)
    	content2
    	;;
    3)
    	content3
    	;;
    *)
    	content4
    	;;
    esac
    
for
  • 基本語法1:for((初始值;循環控制條件;變量變化))格式;do方法體;done結尾;具體累加1-100的和:

    #!/bin/bash
    
    s=0
    for((i=1;i<=100;i++))
    do
    	s=$[$s+$i]
    done
    
    echo $s
    
  • 基本語法2:for 變量 in value1 value2 value3格式;$@區分處理每個入參,$*入參爲整體進行處理

    #!/bin.bash
    
    for i in "$*"
    do
    	echo "ceshi * $*"
    done
    
    for j in "$@"
    do 
    	echo "ceshi @ $@"
    done
    

    bash ceshi.sh zs ls

    輸出結果爲:

    ceshi * zs ls

    ceshi @ zs

    ceshi @ ls

while
  • 基本語法:while [ condition ]格式;do方法體;done結尾;具體累加1-100的和:

    #!/bin/bash
    
    s=0
    i=0
    while [ $i -le 100]
    do
    	s=$[$s+$i]
    	i=$[$i+1]
    done
    

Read讀取控制檯輸入

  • 基本語法:read(選項)(參數)

    • 選項
      • -p,指定讀取值時的提示符
      • -t,指定讀取值時等待的時間(秒)
    • 參數
      • 變量:指定讀取值的變量名
  • 舉例:七秒內在控制檯上輸入name

    #!/bin/bash
    
    read -t 7 -p "input your name in 7 seconds" name
    
    echo $name
    

函數

系統函數
  • basename [string/pathname][suffix],截取指定路徑下的文件名稱
  • dirname 文件絕對路徑,從給定包含絕對路徑的文件名中取出文件的所在路徑
自定義函數
  • 基本語法

    // 聲明函數
    function funname[()]{
    	action;
    	[return int;]
    }
    funname // 執行函數
    

Shell工具

cut命令
  • 從文件的每一行剪切字節、字符和字段,並將這些字節、字符、字段輸出。

  • 基本用法

    • cut [選項參數] filename

    • 選項參數

      • -f,列號,提取第幾列
      • -d,分隔符,按照指定分隔符分割列,默認分割符爲製表符\t
    • 舉例:以空格爲分割符,切割文件內容第二列及以後內容輸出

      cut -d " " -f 2- cut.txt

sed
  • 流編輯器,一次處理一行內容。處理行內容時,把當前的行內容存儲在臨時緩存區中,稱爲"模式空間",接着用sed命令處理緩衝區中的內容,處理完成後將內容輸出。接着處理下一行,直到文末末尾。

  • 基本用法

    • sed [選項參數] "命令功能" filename

    • 選項參數

      • -e,直接在指定列模式上進行sed的動作編輯
    • 命令功能(常用)

      • a,新增
      • d,刪除
      • s,查找並替換
    • 舉例:

      • 在文件第二行添加內容:add content

        sed "2a add contend" filename

      • 刪除文件中包含wo的行

        sed "/wo/d" filename

      • 用ni替換文件中的wo

        sed "s/wo/ni/g" filenameg代表全局替換

      • 刪除文件第二行並用ni替換文件中的wo

        sed -e "2d" -e "s/wo/ni/g" filename

awk
  • 文本分析工具,把文件逐行讀入,默認以空格爲分隔符將每行切片,切開的部分可在進行分析處理。

  • 基本用法:awk [選項參數] 'pattern1{action1} pattern2{action2} ...' filenamepattern匹配正則表達式;action匹配內容符合時所執行的命令。

    • 選項參數

      • -F,指定輸入文件分隔符
      • -v,複製一個用戶定義變量
    • 內置變量

      • FILENAME,文件名
      • NR,已讀記錄數
      • NF,瀏覽記錄的域的個數(切割後,列的個數)
    • 舉例:搜索文件以root開頭的所有行,並輸出該行的第七列

      awk -F : '/^root/{print $7}' filename

sort
  • 文件排序,並按照排序結果標準輸出

  • 基本用法

    • sort(選項)(參數)

      • 選項

      • -n,按照數值大小排序

      • -r,以相反的順序排序

      • -t,設置排序的所用分割字符

      • -k,指定需要排序的列

      • 參數

        • 指定待排序的文件列表
      • 舉例:文件按照冒號分割,第三列倒序排序

        sort -t : -nrk 3 filename

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章