linux學習筆記之shell程式設計
1.什麼是Shell?
Shell是一個命令列直譯器,它為使用者提供一個向linux核心傳送請求以便執行程式的介面系統級程式,使用者可以用Shell來啟動、掛起、停止甚至編寫一些程式。
Shell還是一個功能強大的程式語言,易編寫、已除錯、靈活性強。Shell是解釋執行的指令碼語言,在shell中可以呼叫linux系統命令。
2.Shell指令碼的執行方式
1)echo輸出內容到控制檯
語法:echo[選項][內容]
例:echo “helloworld”
2)指令碼格式
指令碼是以#!/bin/bash開頭
3)第一個指令碼
[[email protected] datas]$ touch helloworld.sh
[[email protected] datas]$ vi helloworld.sh
在helloworld.sh中輸入如下內容
#!/bin/bash
echo "helloworld"
4)指令碼的常用執行方式
- 第一種 輸入指令碼的相對路徑或絕對路徑
/root/helloWorld.sh 或 ./helloWorld.sh - 第二種 sh + 指令碼
sh /root/helloWorld.sh 或 sh ./helloWorld.sh
3. Shell 中的變數
1)自定義變數和系統變數
系統變數:$HOME、$PWD、$SHELL、$USER等等
自定義變數:$A 、$B 等等
2)定義變數
- 基本語法
(1)定義變數:變數=值
(2)撤銷變數:unset 變數
(3)宣告靜態變數:readonly 變數(注意:不能unset) - 變數定義規則
(1)變數名稱可以由字母、數字和下劃線組成,但是不能以數字開頭。
(2)等號兩側不能有空格 (一定要注意 !!!)
(3)變數名稱一般習慣為大寫
(4)雙引號和單引號有區別,雙引號僅將空格脫意,單引號會將所有特殊字元脫意
3)位置引數變數 - 基本語法
$n (功能描述:n為數字,$0代表命令本身,$1-$9代表第一到第九個引數,
十以上的引數,十以上的引數需要用大括號包含,如${10})
$* (功能描述:這個變數代表命令列中所有的引數,$*把所有的引數看成
一個整體)
[email protected] (功能描述:這個變數也代表命令列中所有的引數,不過[email protected]把每個
引數區分對待)
$# (功能描述:這個變數代表命令列中所有引數的個數)
- 案例
輸出輸入的的引數1,引數2,所有引數,引數個數
#!/bin/bash
echo "$1 $2"
echo "$*"
echo "[email protected]"
echo "$#"
4)預定義變數
- 語法
$$ (功能描述:當前程序的程序號(PID))
$! (功能描述:後臺執行的最後一個程序的程序號(PID))
$? (功能描述:最後一次執行的命令的返回狀態。如果這個變數的值為0,證明上一個命令正確執行;如果這個變數的值為非0(具體是哪個數,由命令自己來決定),則證明上一個命令執行不正確了。)
4.運算子
1)基本語法
$$ (功能描述:當前程序的程序號(PID))
$! (功能描述:後臺執行的最後一個程序的程序號(PID))
$? (功能描述:最後一次執行的命令的返回狀態。如果這個變數的值為0,證明上一個命令正確執行;如果這個變數的值為非0(具體是哪個數,由命令自己來決定),則證明上一個命令執行不正確了。)
2)案例 計算(2+3)*4
方法一:採用$[運算式]方法
[[email protected] datas]# S=$[(2+3)*4]
[[email protected] datas]# echo $S
方法二:expr分步計算
S=`expr 2 + 3`
expr $S \* 4
方法三:expr一步完成計算
expr `expr 2 + 3` \* 4
5.流程控制
1)if 判斷
-
基本語法
if [ 條件判斷式 ];then
程式
fiif [ 條件判斷式 ]
then
程式
fi注意事項:[ 條件判斷式 ],中括號和條件判斷式之間必須有空格
-
案例
判斷輸入的數是否等於123,是否等於456
#!/bin/bash
if [ $1 -eq "123" ]
then
echo "123"
elif [ $1 -eq "456" ]
then
echo "456"
fi
2)case語句
- 基本語法
case $變數名 in
“值1”)
如果變數的值等於值1,則執行程式1
;;
“值2”)
如果變數的值等於值2,則執行程式2
;;
…省略其他分支…
*)
如果變數的值都不是以上的值,則執行此程式
;;
esac - 案例
輸入1,輸出1;輸入2,輸出2;輸入其他,輸出other
#!/bin/bash
case $1 in
"1")
echo "1"
;;
"2")
echo "2"
;;
*)
echo "other"
;;
esac
3)for 迴圈
- 基本語法
for 變數 in 值1 值2 值3…
do
程式
done
或
for (( 初始值;迴圈控制條件;變數變化 ))
do
程式
done
- 案例
從1加到100
#!/bin/bash
s=0
for((i=0;i<=100;i++))
do
s=$[$s+$i]
done
echo "$s"
4)while迴圈
- 基本語法:
while [ 條件判斷式 ]
do
程式
done
- 案例
從1加到100
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
s=$[$s+$i]
i=$[$i+1]
done
echo $s
6.read讀取控制檯輸入
- 基本語法:
read(選項)(引數)
選項:
-p:指定讀取值時的提示符;
-t:指定讀取值時等待的時間(秒)
引數
變數:指定讀取值的變數名 - 案例
讀取控制檯輸入的名稱
#!/bin/bash
read -t 7 -p "please 7 miao input your name " NAME
echo $NAME
7.函式
1)系統函式
- basename基本語法
basename [pathname] [suffix]
basename [string] [suffix] (功能描述:basename命令會刪掉所有的字首包括最後一個(‘/’)字元,然後將字串顯示出來。
選項:
suffix為字尾,如果suffix被指定了,basename會將pathname或string中的suffix去掉。 - 案例
[[email protected] opt]$ basename /opt/test.txt
test.txt - dirname基本語法
dirname 檔案絕對路徑 (功能描述:從給定的包含絕對路徑的檔名中去除檔名(非目錄的部分),然後返回剩下的路徑(目錄的部分)) - 案例
[[email protected] opt]$ dirname /opt/test.txt
/opt
2)自定義函式
-
基本語法:
[ function ] funname[()]
{
Action;
[return int;]
}funname
-
注意:
(1)必須在呼叫函式地方之前,先宣告函式,shell指令碼是逐行執行。不會像其它語言一樣先編譯。
(2)函式返回值,只能通過$?系統變數獲得,可以顯示加:return返回,如果不加,將以最後一條命令執行結果,作為返回值。return後跟數值n(0-255) -
案例
(1)計算輸入引數的和
#!/bin/bash
function sum()
{
s=0
s=$[ $1 + $2 ]
echo "$s"
}
read -p "Please input the number1: " n1;
read -p "Please input the number: " n2;
sum $n1 $n2;