Linux的基本操作——Shell程式設計
一、基本介紹
Shell是使用者與核心進行互動操作的一種介面,目前最流行的Shell稱為bash Shell。Shell也是一門程式語言<解釋型的程式語言>,即shell指令碼。一個系統可以存在多個shell,可以通過cat /etc/shells命令檢視系統中安裝的shell,不同的shell可能支援的命令語法是不相同的。
二、Shell指令碼的執行方式
- 第一種:輸入指令碼的絕對路徑或相對路徑,首先要賦予+x許可權
chmod +x helloWorld.sh
/root/helloWorld.sh
./helloWorld.sh
- 第二種:bash或sh +指令碼
sh /root/helloWorld.sh
sh helloWorld.sh
第三種:在指令碼的路徑前再加". "
. /root/helloWorld.sh
. ./helloWorld.sh
區別:第一種和第二種會新開一個bash,不同bash中的變數無法共享,第三種,就是在同一個shell程序中執行。
三、Shell中的變數
1、變數定義
Linux Shell中的變數分為“系統變數”和“使用者自定義變數”,可以通過set命令檢視那行系統變數。系統變數:$HOME、$PWD、$SHELL、$USER等等。對應使用者自定義變數語法為:
變數=值 (例如STR=abc,如果值中間沒有空格可以不加“”)
注意:
- 等號兩側不能有空格
- 變數名稱一般習慣為大寫
- 雙引號和單引號有區別,雙引號僅將空格脫意,單引號會將所有特殊字元脫意,例如:
A="fell"
B="hello $A"
echo $B #==>'hello fell'
B='hello $A'
echo $B #==>'hello $A'
- unset A 撤銷變數 A
- readonly B=2 宣告靜態的變數 B=2 ,不能 unset
- export 變數名 可把變數提升為全域性環境變數,可供其他shell程式使用
2、將命令的返回值賦給變數
- A=`ls -la` 反引號,執行裡面的命令,並把結果返回給變數A
- A=$(ls -la) 等價於反引號
3、Shell中的特殊變數
- $? 表示上一個命令退出的狀態
- $$ 表示當前程序編號
- $0 表示當前指令碼名稱
- $n 表示n位置的輸入引數(n代表數字,n>=1)
- $# 表示引數的個數,常用於迴圈
- $*和[email protected] 都表示引數列表,他們的區別為:$* 和 [email protected] 都表示傳遞給函式或指令碼的所有引數,不被雙引號" "包含時,都以$1 $2 … $n 的形式輸出所有引數。當它們被雙引號" "包含時,"$*" 會將所有的引數作為一個整體,以"$1 $2 … $n"的形式輸出所有引數;"[email protected]" 會將各個引數分開,以"$1" "$2" … "$n" 的形式輸出所有引數
4、運算子
格式為 expr m + n 或$((m+n)) 注意expr運算子間要有空格,例如計算(2 +3 )×4 的值:
1 .分步計算
S=`expr 2 + 3`
expr $S \* 4
2.一步完成計算
expr `expr 2 + 3 ` \* 4
echo `expr \`expr 2 + 3\` \* 4`
##或
$(((2+3)*4))
四、邏輯語句
1、For迴圈
第一種:
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 "welcome $i times"
done
或
for ((i = 0; i <= 5; i++)); do echo "welcome $i times"; done
2、While迴圈
第一種:
while expression
do
command
…
done
第二種:
i=1
while ((i<=3))
do
echo $i
let i++
done
3、case語句
格式為:
case $1 in
start)
echo "starting"
;;
stop)
echo "stoping"
;;
*)
echo "Usage: {start|stop} “
esac
4、If判斷
語法格式為:
if condition
then
statements
[elif condition
then statements. ..]
[else
statements ]
fi
if例子如下:
#!/bin/bash
read -p "please input your name:" NAME
#printf '%s\n' $NAME
if [ $NAME = root ]
then
echo "hello ${NAME}, welcome !"
elif [ $NAME = itcast ]
then
echo "hello ${NAME}, welcome !"
else
echo "SB, get out here !"
fi
其中條件語句[ condition ] (注意condition前後要有空格),非空返回true,可使用$?驗證(0為true,>1為false),空返回false([ ]),下面的例子類似於三元運算子, 條件滿足,執行後面的語句:
[ condition ] && echo OK || echo notok
附:常用判斷條件
- = 字串比較
- -lt 小於
- -le 小於等於
- -eq 等於
- -gt 大於
- -ge 大於等於
- -ne 不等於
- -r 有讀的許可權
- -w 有寫的許可權
- -x 有執行的許可權
- -f 檔案存在並且是一個常規的檔案
- -s 檔案存在且不為空
- -d 檔案存在並是一個目錄
- -b檔案存在並且是一個塊裝置
- -L 檔案存在並且是一個連結
五、Shell自定義函式
語法如下:
[ function ] funname [()]
{
action;
[return int;]
}
function start() / function start / start()
1.必須在呼叫函式地方之前,先宣告函式,shell指令碼是逐行執行。不會像其它語言一樣先預編譯
2.函式返回值,只能通過$? 系統變數獲得,可以顯示加:return 返回,如果不加,將以最後一條命令執行結果,作為返回值。 return後跟數值n(0-255)
六、雜記
1、指令碼除錯
sh -vx helloWorld.sh
或者在指令碼中增加set -x
2、read命令
read -p(提示語句)-n(字元個數) -t(等待時間)
read -p "please input your name: " NAME
使用示例: