shell 基礎

變數

邏輯控制

shell 指令碼demo

函式

1、變數

定義一個 a=1 的變數,然後輸入 echo $a 指令,其中 $a 表示可以引用這個變數

a=1

echo $a

b=hello

echo $b

c=hello world

echo $c

這時候會報錯,因為 x=hello 會被認為是一個變數賦值,而 world 會被認為是另外一個獨立的命令

c="hello world"

echo $c

需要對字串加上單引號或者雙引號。然後再列印這個變數

知識點一: 單引號和雙引號的區別?

01、單引號和雙引號的區別在於是否支援轉義,雙引號可以對轉義符號進行處理

02、= 左右不要有空格;

03、如果內容有空格,需要使用單引號或雙引號;

04、雙引號支援轉義符,$ 開頭的變數會被自動替換;

知識點二:幾個預定義變數

01、PWD 表示當前目錄;

02、USER 表示當前使用者;

03、HOME 表示當前使用者的主目錄,HOME 還可以用 ~ 簡寫;

04、PATH 表示當前所有可執行程式;

05、RANDOM 可以產生一個隨機數

echo $PWD

echo $USER

echo $HOME 或者 echo ~

echo $PATH

echo $RANDOM

1。2、輸入 x=$(echo mryt_qa) 指令將字串 mryt_qa 存入 x 變數中,這時輸入 echo $x 指令,你會看到 $() 會把括號內的命令執行然後把輸出結果作為值傳遞給變數

x=$(echo mryt_qa)

echo $x

1。3、序列,從 1~10 獲取一個序列,可以輸入 echo {1。。10} 指令來列印 1~10 的數字

echo {1..10} 或者 seq 1 10

——-

2、邏輯控制

知識點三、shell中的邏輯控制與python基礎一致,常見包含:

01、條件判斷 if;

02、分支判斷 case、select,根據不同的條件進行不同的處理;

03、迴圈 for、while、until;

04、break 和 continue,退出迴圈;

2。1、輸入 for i in $(seq 1 3 10) 指令,然後在 do 語句塊中列印 echo $i 的值,do 語句塊以 done 結束

for i in $(seq 1 3 10)

do

echo $i

done

2。2、定義 i=0, 輸出結果每隔 1 秒列印一個 i 的值,而 i 的值逐漸增加,直到等於 3 時不再滿足條件,退出迴圈

i=0

while ((i<3));do ((i=i+1));sleep 1;echo $i;done

2。3、while read line 迴圈讀取檔案的每一行

while read line; do echo $line;done < /tmp/first.txt

2。4、或者透過管道也可以等價

cat /tmp/first.txt | while read line;do echo $line;done

——-

3、shell 指令碼demo

3。1、輸入 vim /tmp/demo。sh 指令建立了 demo。sh 檔案

vim /tmp/demo.sh

3。2、demo。sh 輸入p0=$0、p1=$1 p2=$2,以及 $@ 和 $*並列印

#!/bin/sh

# 指令碼註釋: 指令碼demo,程式不會執行註釋

echo p0=$0

echo p1=$1 p2=$2

echo $@

echo $*

執行:bash /tmp/demo。sh

使用 bash /tmp/1。sh,在執行結果中 $0 是當前的檔名,但此時引數沒有值, 顯示

p0=/tmp/demo。sh

p1= p2=

3。3、輸入引數 x、y 傳遞給指令碼,你可以看到輸出結果中第一個引數是 x,第二個引數是 y,這就是引數的解析規則

bash /tmp/demo。sh x y

知識點四:$@ 與 $* 都表示所有的引數但它們有什麼區別?

答:可以簡單的理解成 $* 會把引數打散,參考以下例子

3。4、比如第二個引數是包含空格的,將 “m n” 作為一個完整的引數傳遞給指令碼並執行,你會發現第二個引數是 m n,但其實 $@ 與 $* 的值已經發生了變化,$* 會將引數打散,而 “$@” 則不會

bash /tmp/demo.sh x "m n"

3。5、demo。sh 使用 for 迴圈來分別列印 “$@” 和 $* 所代表的引數

#!/bin/sh

#指令碼註釋: 指令碼demo,程式不會執行註釋

echo p0=$0

echo p1=$1 p2=$2

for p in "$@";do

echo $p

done

echo $*

for p in $*,do

echo $p

done

執行以上指令碼,如果是“$@”,第一個引數列印的是 x,第二個引數列印的是 m n,而 $* 把第二個引數拆成了兩個

——-

4、函式

函式是以函式名()後跟 {} 括起來的內容組成,函式可以實現一些功能封裝,同時函式也支援與指令碼類似的引數解析

4。1、定義一個 hello 函式,在函式中透過 if 語句判斷第一個引數 $1 是否等於 python,如果等於就列印 python測試。然後執行 hello 函式,你會發現什麼都沒有,是因為你並沒有給函式傳入一個引數,傳入 shell 引數後,系統列印 學習shell基礎

hello(){

if [ "$1" = "python" ]; then echo python測試; fi

}

執行:

hello

hello python

4。2、demo。sh腳本里透過 elif 判斷 $1 是否等於 java,如果等於 java 就列印 java 測試

#!/bin/sh

#指令碼註釋: 指令碼demo,程式不會執行註釋

echo p0=$0

echo p1=$1 p2=$2

for p in "$@";do

echo $p

done

echo $*

for p in $*;do

echo $p

done

if [ "$1" = "python" ]; then

echo python測試

elif [ "$1" = "java" ]; then

echo java測試

fi

執行:

bash /tmp/demo.sh python

bash /tmp/demo.sh java

4。3、demo。sh封裝成一個 hello 函式,有了函式之後就可以在執行的過程中隨時進行呼叫來實現功能封裝和邏輯複用

#!/bin/sh

#指令碼註釋: 指令碼demo,程式不會執行註釋

echo p0=$0

echo p1=$1 p2=$2

for p in "$@";do

echo $p

done

echo $*

for p in $*;do

echo $p

done

# if [ "$1" = "python" ]; then

# echo python測試

# elif [ "$1" = "java" ]; then

# echo java測試

# fi

hello(){

if [ "$1" = "python" ]; then

echo python測試

elif [ "$1" = "java" ]; then

echo java測試

fi

}

hello $2 # 執行 hogwarts 函式並將 $2 引數傳給它,此時 $2 是指令碼的第二個引數,但卻是 hogwarts函式 的第一個引數

執行:

bash /tmp/demo。sh java

bash /tmp/demo。sh python

bash /tmp/demo。sh python java