一、shell定義與執行
shell既是一種應用程序,又是一種程序設計語言
shell是用戶和Linux內核之間的接口程序
》作為應用程序:
交互式地解釋、執行用戶輸入的命令,將用
戶的操作翻譯成機器可以識別的語言,完成相應
功能
》作為程序設計語言:
它定義了各種變量和參數,並提供了許多在
高級語言中才具有的控制結構,包括循環和分支
完成類似於windows下批處理操作,簡化我們
對系統的管理與應用程序的部署
》Linux系統中提供了好幾種不同的shell命令解釋器,如sh、ash、bash等。
》一般默認使用bash作為默認的解釋器。
》我們后面編寫的shell腳本,都是由上述shell命令解釋器解釋執行的。
給文件添加權限
chmod + r + 文件名 給該文件增加可讀的權限
chmod + w + 文件名 給該文件增加可寫的權限
chmod + x + 文件名 給該文件增加可執行的權限
./文件名 執行該文件
系統進行調用的shell腳本
》/etc/profile
此文件為系統的每個用戶設置環境信息,當用戶第一次登錄時,該文件被執行,系統的公告環境變量在這里設置,開始自啟動的程序,一般也在這里設置。
》~/.bashrc
用戶自己的家目錄中的.bashrc
登錄時會自動調用,打開任意終端時也會自動調用
這個文件一般設置與個人用戶有關的環境變量,如交叉編譯器的路徑等等。
1.定義以 #!/bin/bash 開頭
2.單個 # 代表注釋當前行
3.bash 直接指定使用bash解釋文件
例如:
chmod +x test.sh;
./test.sh
bash test.sh
.test.sh
》三種執行腳本的方式不同點:
1、./ 和 bash 執行過程基本一致,后者明確指定bash解釋器去執行腳本,
腳本中 #! 指定的解釋器不起作用。前者首先檢測 #! ,使用 #! 指定的shell,
如果沒有,使用默認的shell。
2、用 ./ 和 bash 去執行會在后台啟動一個新的shell去執行腳本。
用 . 去執行腳本不會啟動新的shell,直接由當前的shell去解釋執行腳本。
二、shell變量
*shell的變量按照變量的作用可以分為4類:
1.環境變量:主要保存與環境相關的參數
2.用戶自定義變量:用在腳本內表達運行過程中數據
3.位置參數變量:用來向腳本中傳遞參數,變量名不能自定
義
4.預定義變量:是bash中已定義的變量,按照變量的作用范
圍可以分為2類:
1.全局變量:是環境變量,其值不隨shell腳本的執行結束而消失
2.局部變量:shell程序內部定義的,其使用范圍僅限於定義
它的程序,包括用戶自定義變量、位置變量和預定義變量。
一、自定義變量
定義變量 變量名 = 變量值 如:num = 10
引用變量 $變量名 如:i = $num 把變量num的值付給變量i
顯示變量 使用echo命令可以顯示單個變量取值 如:echo $num
清除變量 使用unset命令清除變量 如:unset num
二、讀取變量
read string 從鍵盤輸入一個字符串賦值給變量string,若string沒定義,則先定義再使用。
readonly string = 100 定義一個只讀變量,只能在定義時初始化賦值,
以后其值不能改變,不能被清除。
export STRING = 300 使用export說明的變量,會被導出為環境變量。其他shell均可使用。
傳統上,所有環境變量均為大寫
顯示環境變量 使用env命令可以查看所有的環境變量
清除環境變量 使用unset命令清除環境變量
三、注意事項
1.變量名只能是英語字母、下划線、數字。開頭不能是數字
1_num = 10 錯誤
num_1 = 10 正確
2.等號兩邊不能直接接空格符,若變量中本身就包含了空格,
則整個字符串都要用雙引號、或單引號括起來;雙引號內的特殊字符(即 $變量)
可以保留變量的特性,但是單引號內的特殊字符則僅為一般的字符,沒有特殊意義。
name=aa bb //錯誤
name="aa bb" //正確
echo "$name is me" //輸出:aa bb is me
echo "$name is me" //輸出:$name is me
四、環境變量:
》shell在開始執行時就已經定義了一些和系統的工作環境有
關的變量,我們在shell中可以直接使用$name引用
》定義:
一般在~/.bashrc或/etc/profile文件中(系統自動調用的腳
本)使用export設置,允許用戶后來更改
VARNAME = value ;export VARNAME
》傳統上,所有環境變量均為大寫
》顯示環境變量
使用env 命令可以查看所有的環境變量。
》清除環境變量
使用unset 命令清除環境變量
常見環境變量:
HOME 用於保存注冊目錄的完全路徑名
PATH 用於保存用冒號分隔的目錄路徑名,shell將按PATH變量中給出的順序搜索這目錄,
找到的第一個與命令名稱一致的可執行文件將被執行
PATH=$HOME/bin:/bin:/usr/bin;export PATH
HOSTNAME 主機名
SHELL 默認的shell命令解析器
LOGNAME 此變量保存登錄名
PWD 當前工作目錄的絕對路徑名
······
五、預定義變量
預定義變量:
$# 傳給shell腳本參數的數量
$* 傳給shell腳本參數的內容
$1、$2、$3、...、$9 運行腳本時傳遞給其的參數,用空格隔開
$? 命令執行后返回的狀態,"$?"用於檢查上一個命令是否正確
(在Linux中,命令退出狀態為0表示該命令正確執行,任何非0值表示命令出錯)
$0 當前執行的進程名
$$ 當前進程的進程號,"$$"變量最常見的用途是用作臨時文件的名字以保證臨時文件不會重復
腳本變量的特殊用法:"" `` ' \ () {}
》""(雙引號):包含的變量會被解釋
》''(單引號):包含的變量會當做字符串解釋
》``(數字鍵1左面的反引號):反引號中的內容作為系統命令
,並執行其內容,可以替換輸出為一個變量
$ echo "today is "
today is 2012年07月29日星期日 12:55:21 CST
》\ 轉義字符:
同c語言 \n \t \r \a等 echo命令需加-e轉義
》(命令序列):
由子shell來完成,不影響當前shell中的變量
》{ 命令序列 }:---注意:“{”、“}”前后有一空格
在當前shell中執行,會影響當前變量
三、條件測試語句
》在寫shell腳本時,經常遇到的問題就是判斷字符串是否相等,
可能還要檢查文件狀態或進行數字測試,只有這些測試完成才能
做下一步動作
》test命令:用於測試字符串、文件狀態和數字
》test命令有兩種格式:
test condition 或[ condition ]
使用方括號時,要注意在條件兩邊加上空格
》shell腳本中的條件測試如下:
文件測試、字符串測試、數字測試、復合測試
》測試語句一般與后面講的條件語句聯合使用
*文件測試:測試文件狀態的條件表達式
-e 是否存在
-d 是目錄
-f 是文件
-r 可讀
-w 可寫
-x 可執行
-L 符號連接
-c 是否字符設備
-b 是否塊設備
-s 文件非空
字符串測試:
test str_operator “str”
test “str1” str_operator “str2”
[ str_operator “str” ]
[ “str1” str_operator “str2”]
》其中str_operator可以是:
= 兩個字符串相等
!= 兩個字符串不相等
-z 空串
-n 非空串
測試數值格式如下:
test num1 num_operator num2
[ num1 num_operator num2 ]
》*num_operator可以是:
-eq 數值相等
-ne 數值不相等
-gt 數1大於數2
-ge 數1大於等於數2
-le 數1小於等於數2
-lt 數1小於數2
命令執行控制:
》&&:
command1 && command2
&&左邊命令(command1)執行成功(即返回0)shell才執行&&
右邊的命令(command2)
》||
command1 || command2
||左邊的命令(command1)未執行成功(即返回非0)shell才
執行||右邊的命令(command2)
例:
test -e /home && test -d /home && echo "true"
test 2 -lt 3 && test 5 -gt 3 && echo "equal"
test "aaa" = "aaa" || echo "not equal" && echo "equal"
多重條件判定:
-a | (and)兩狀況同時成立!test -r file -a -x file,file同時具有r與x權限時,才為true. |
---|---|
-o | (or)兩狀況任何一個成立!t t est -r file -o -x file,file具有r或x權限時,就傳回true. |
! | 相反狀態test ! -x file,當file不具有x時,回傳true. |
四、控制語句 if case for while until break
①====》
if [條件1];
then
執行第一段程序
else
執行第二段程序
fi
②====》
if [條件1];
then
執行第一段程序
elif [條件2]
then
執行第二段程序
else
執行第三段程序
fi
case $變量名稱 in
“第一個變量內容”)
程序段一
;;
“第二個變量內容”)
程序段二
;;
*)
其它程序段
exit 1
esac
for (( 初始值; 限制值; 執行步階
))
do
程序段
done
初始值:變量在循環中的起始值
限制值:當變量值在這個限制范圍內時,就繼續進行循環
執行步階:每作一次循環時,變量的變化量
》declare是bash的一個內建命令,可以用來聲明shell
變量、設置變量的屬性。declare也可以寫作typeset。
declare -i s 代表強制把s變量當做int型參數運算
for var in con1 con2 con3 ...
do
程序段
done
第一次循環時,$var的內容為con1
第二次循環時,$var的內容為con2
第三次循環時,$var的內容為con3
......
while [ condition ]
do
程序段
done
當condition成立的時候進入while循環,直到condition不成立時才退出循環。
until [ condition ]
do
程序段
done
這種方式與while恰恰相反,當condition成立的時候退出循環,否則繼續循環。
break
》break命令允許跳出循環。
》break 通常在進行一些處理后退出循環或case 語句
continue
》continue 命令類似於break 命令
》只有一點重要差別,它不會跳出循環,只是跳過這個循環步
五、函數
》 有些腳本段間互相重復,如果能只寫一次代碼塊而在任何地方都能引用那就提高了代碼的可重用性。
》 shell允許將一組命令集或語句形成一個可用塊,這些塊稱為shell函數。
》 定義函數的兩種格式:
函數名() {
命令 ...
}
function 函數名() {
命令 ...
}
》 函數可以放在同一個文件中作為一段代碼,也可以放在只包含函數的單獨文件中。
》 所有函數在使用前必須定義,必須將函數放在腳本開始部分,直至shell解釋器首次發現它時,才可以使用。
調用函數的格式為:
函數名 param1 param2……
》 使用參數同在一般腳本中使用特殊變量
$1,$2 ...$9一樣
》 函數可以使用return 提前結束並帶回返回值
return 從函數中返回,用最后狀態命令決定返回值。
return 0 無錯誤返回
return 1 有錯誤返回