1. 程式人生 > >大資料 Shell基礎

大資料 Shell基礎

前言

介紹

Shell 是用來解決什麼問題的? - 偉哥-Wayne的回答 - 知乎

Linux的命令列介面歸結起來就是各種Shell,那麼到底什麼是Shell?

Shell就是一個命令列直譯器,它的作用是解釋執行使用者的命令,使用者輸入一條命令,Shell就解釋執行一條,這種方式稱為互動式(Interactive)。

Shell,譯為外殼,是使用者直接連入計算機所使用的計算機程式,負責解析使用者提供的命令,如詞法分析、語法分析、句法分析。

完整教程

Shell執行方式

  1. ./test.sh
  2. sh test.sh
  3. source test.sh

方式1和方式2其實是一樣的,都是在當前父程序下的子程序中執行,子程序執行結束之後,子程序中的變數和操作將會結束而且不會傳回到父程序中。

換句話說,方式1和方式2是作用於子程序本身,方式3則作用於整個父程序

Shell變數

檢視系統變數可以使用set命令檢視。

變數的宣告採用的是變數名=值的方式定義,而且等號的左右不能有空格,否則報錯,變數名稱一般習慣採用大寫。

在定義變數的時候,雙引號是允許格式化字串,比如Hello World!$USERNAME輸出結果為Hello World!Linux。而單引號禁止格式化字串,即Hello World!$USERNAME輸出結果為Hello World!$USERNAME

  • 雙引號的優點:
    • 雙引號裡可以出現轉義字元
    • 雙引號裡可以有變數
  • 單引號的限制:
    • 單引號裡的任何字元都會原樣輸出,單引號字串中的變數是無效的;
    • 單引號字串中不能出現單獨一個的單引號(對單引號使用轉義符後也不行),但可成對出現,作為字串拼接使用。

系統變數可以使用unset 變數名撤銷。

如果想要把一個變數升級為全域性環境變數,可以採用export關鍵字來提升。

如果希望變數只讀,可以使用readonly關鍵字宣告,比如readonly 變數名

特殊變數替換

變數替換 說明
${var:-value} 如果變數var的值未被設定或者為null,使用value作為變數var的值進行替換。否則,使用var的值進行替換。在替換的過程中,變數var的值不變。
${var:=value} 如果變數var的值未被設定或者為null,則將value賦給變數var,並進行替換。
${var:+value} 如果變數var的值未被設定或者為null,則使用null進行替換。否則,使用value進行替換。在替換的過程中,變數var的值不變。
${var:?value} 如果變數var的值已經設定,則使用var的值替換。如果變數var的值未被設定或者為null,則使用value作為錯誤提示資訊。如果省略了value,則輸出預設的錯誤提示資訊,表示var未被設定,然後終止指令碼執行。在替換過程中,var的值不變。

Shell運算子

獲取執行結果

  • what=`ls -al`
    • 執行ls -al並將執行結果賦值給變數what
  • what=$(ls -al)
    • 同上,注意:$()是賦值操作。
  • expr,可以使用expr表示式計算表示式的結果。
    • 注意:expr表示式後面的運算子和變數都需要用空格分隔。
    • 例如計算 ( 3 + 4 ) × 12 (3+4)×12 【僅僅支援整數運算】
      • a=`expr 3 + 4` * 12
      • 等價於a=$(((3+4)*12))
      • 注意:$(())用於表示式結果計算,必須是雙重小括號。

引數傳遞

引數處理 引數處理說明
$# 傳遞到指令碼的引數個數。
$* 以一個單字串顯示所有向指令碼傳遞的引數。如"$*“用「”」括起來的情況、以"$1 $2 … $n"的形式輸出所有引數。
$$ 指令碼執行的當前程序ID號。
$! 後臺執行的最後一個程序的ID號。
[email protected] $*相同,但是使用時加引號,並在引號中返回每個引數。如"[email protected]“用「”」括起來的情況、以"$1" “$2” … "$n"的形式輸出所有引數。
$- 顯示Shell使用的當前選項,與set命令功能相同。
$? 顯示最後命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤。

流程控制

shell for

# !/bin/bash

# 多層迴圈
for N in 1 2 3
do 
  echo $N
done

# 單行顯示
for N in 1 2 3; do echo $N; done

# 當行顯示
for N in {1..3};do echo $N; done

for ((i=0;i<=5;i++))
do
  echo $i
done

for ((i=0;i<=5;i++));do echo $i;done;

while迴圈

i=1

while ((i<=3))
do
  echo $i
  let i++
done
unset i

case

case $1 in
  start)
    echo "starting"
    ;;
  stop)
    echo "ending"
    ;;
  *)
    echo "Usage:{start|stop}"
esac

這裡寫圖片描述

Shell 關係運算符

字串比較

注意:Linux中,true是0,false是1……
說明:執行了舉例中的程式碼後,需要執行echo $?來輸出結果。

運算子 說明 舉例
= 字串比較 [ 0 = 0 ]輸出結果為0
-lt 小於 [ 4 -lt 5 ]輸出結果為0
-le 小於等於 [ 4 -le 4 ]輸出結果為0
-eq 等於 [ 4 -eq 4 ]輸出結果為0
-gt 大於 [ 4 -gt 5 ]輸出結果為1
-ge 大於等於 [ 4 -ge 5 ]輸出結果為1
-ne 不等於 [ 4 -ne 5 ]輸出結果為0

這裡寫圖片描述

注意:表示式需要用中括號包裹起來,而且中間必須使用空格分隔,否則報錯

檔案操作

說明:執行了舉例中的程式碼後,需要執行echo $?來輸出結果。

運算子 說明 舉例
-r 是否有讀的許可權。 [ -r "test1.sh" ]
-w 是否有寫的許可權。 [ -w "test1.sh" ]
-x 是否有執行的許可權。 [ -x "test1.sh" ]
-f 檔案是否存在bin是一個常規的檔案。 [ -f "test1.sh" ]
-s 檔案是否存在且不為空。 [ -s "/opt" ]
-d 檔案是否存在且是一個塊裝置。 [ -b "/dev/block/7:0" ]
-L 檔案是否存在且是一個連結。 [ -L "/usr/bin/java" ]

這裡寫圖片描述

Shell函式

注意事項如下

  1. 必須在呼叫函式地方之前,先宣告函式,shell指令碼是逐行執行。【解釋型】
  2. 函式返回值,只能通過$?系統變數獲得,可以顯示加:return返回;如果不加,將以最後一條命令執行結果,作為返回值。 return後跟數值 n ( 0 255 ) n(0-255)

這裡寫圖片描述

# !/bin/bash

add() {
  temp=$(($1+$2))
  return temp
}

add 11 22
a=$?

echo --------------
echo "11 + 22 = $a"

輸出結果是:

--------------
11 + 22 = 33

Shell除錯

shell的除錯可以在sh 命令後指定引數-vx,比如sh -vx test1.sh
  
這裡寫圖片描述

Shell 高階指令

  • cut
  • sort
  • uniq
  • wc
    • -c--bytes--chars:只顯示Bytes數;
    • -l--lines:只顯示列數;
    • -w--words:只顯示字數。
  • sed
  • awk

附錄