大資料 Shell基礎
前言
- 大資料 基礎概念
- 大資料 Centos基礎
- 大資料 Shell基礎
- 大資料 ZooKeeper
- 大資料 Hadoop介紹、配置與使用
- 大資料 Hadoop之HDFS
- 大資料 MapReduce
- 大資料 Hive
- 大資料 Yarn
- 大資料 MapReduce使用
- 大資料 Hadoop高可用HA
介紹
Linux的命令列介面歸結起來就是各種Shell,那麼到底什麼是Shell?
Shell就是一個命令列直譯器,它的作用是解釋執行使用者的命令,使用者輸入一條命令,Shell就解釋執行一條,這種方式稱為互動式(Interactive)。
Shell,譯為外殼,是使用者直接連入計算機所使用的計算機程式,負責解析使用者提供的命令,如詞法分析、語法分析、句法分析。
完整教程
Shell執行方式
./test.sh
sh test.sh
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
表示式後面的運算子和變數都需要用空格分隔。 - 例如計算
【僅僅支援整數運算】
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函式
注意事項如下
- 必須在呼叫函式地方之前,先宣告函式,
shell
指令碼是逐行執行。【解釋型】 - 函式返回值,只能通過
$?
系統變數獲得,可以顯示加:return
返回;如果不加,將以最後一條命令執行結果,作為返回值。return
後跟數值 。
# !/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
。