1. shell腳本基礎(chǔ)知識(shí)
shell腳本是一個(gè)文件,里面存放的是特定格式的指令,系統(tǒng)可以使用腳本解析器翻譯或解析指令并執(zhí)行(無需編譯),shell腳本的本質(zhì)是shell命令的有序集合
shell腳本編程的基本過程分為三步:
建立shell文件:包含任意多行操作系統(tǒng)命令或shell命令的文本文件
vi test.sh
賦予shell文件執(zhí)行權(quán)限:用chmod命令修改權(quán)限
chmod 740 test.sh
執(zhí)行shell文件:直接在命令行上調(diào)用shell程序
./test.sh
2. shell變量
shell允許用戶建立變量存儲(chǔ)數(shù)據(jù),但不支持?jǐn)?shù)據(jù)類型(整型、字符、浮點(diǎn)型), 任何賦給變量的值都被解釋為一串字符。
定義shell變量名時(shí),首個(gè)字符必須為字母,不能以數(shù)字開頭,中間不能有空格,可以使用下劃線,不能使用中橫線及標(biāo)點(diǎn)符號(hào)等。 shell變量分為系統(tǒng)變量、環(huán)境變量和用戶變量三種:
用戶變量:用戶自定義變量,通常使用全大寫定義變量名,方便識(shí)別; 在變量前加 $ 調(diào)用變量; 從右向左賦值; unset命令可刪除變量的賦值
COUNT=1 #通常使用全大寫定義變量名,方便識(shí)別
echo $HOME #在變量前加 $ 調(diào)用變量
# Linux Shell/bash從右向左賦值
Y=y
X=$Y
echo $X
y
#使用unset命令刪除變量的賦值
Z=hello
echo $Z
hello
unset Z
echo $Z
系統(tǒng)變量:用于對(duì)參數(shù)判斷和命令返回值判斷時(shí)使用
$0 #當(dāng)前腳本的名稱
$n #傳遞給腳本或函數(shù)的第n個(gè)參數(shù),n=1,2,…9
$# #傳遞給腳本或函數(shù)的參數(shù)個(gè)數(shù)
$* #傳遞給腳本或函數(shù)的所有參數(shù):“$1,$2,……$9” 整體傳遞
$@ #傳遞給腳本或函數(shù)的所有參數(shù):“$1”,“$2”,……“$9” 分開傳遞
$? #命令或程序執(zhí)行完后的狀態(tài),返回0表示執(zhí)行成功
$$ #當(dāng)前腳本程序的PID號(hào)
環(huán)境變量:在程序運(yùn)行時(shí)需要設(shè)置
PATH #shell搜索路徑,以冒號(hào)為分割
HOME #/etc/passwd文件中列出的用戶主目錄
SHELL #當(dāng)前Shell類型
USER #當(dāng)前用戶名
ID #當(dāng)前用戶id信息
PWD #當(dāng)前所在路徑
TERM #當(dāng)前終端類型
HOSTNAME #當(dāng)前主機(jī)名;
PS1 #定義主機(jī)命令提示符
HISTSIZE #歷史命令大小,可通過HISTTIMEFORMAT變量設(shè)置命令執(zhí)行時(shí)間
RANDOM #隨機(jī)生成一個(gè)0至32767的整數(shù)
HOSTNAME #主機(jī)名
3. shell功能語句
shell腳本程序由單條或多條shell語句構(gòu)成。 shell語句包括三類:說明性語句、功能性語句和結(jié)構(gòu)性語句
說明性語句:即注釋行,以 # 號(hào)開始到該行結(jié)束,不被解釋執(zhí)行
#! /bin/sh
# 以上是告訴OS用哪種類型的shell來解釋執(zhí)行該程序
功能性語句:任意的shell命令、用戶程序或其它shell程序。 以read命令和expr命令為例
read命令:read從標(biāo)準(zhǔn)輸入讀入一行, 并賦值給后面的變量。 若標(biāo)準(zhǔn)輸入無數(shù)據(jù), 則程序在此停留等侯, 直到數(shù)據(jù)到來或被終止運(yùn)行
read var #把讀入的數(shù)據(jù)全部賦給var
read var1 var2 var3 #把讀入行中的第一個(gè)詞賦給var1,第二個(gè)賦給var2,其余所有賦給var3
expr命令:用于簡(jiǎn)單的整數(shù)運(yùn)算,包括加(+)、減(-)、乘(*)、整除(/)和求模(%)等操作
expr 12 + 5 \\* 3 #反斜線\\去掉*號(hào)的元字符含義
27
expr 3 - 8 / 2
-1
#####
num=9
sum=`expr $num \\* 6` #反撇號(hào)`引用命令的運(yùn)行結(jié)果
echo $sum
54
結(jié)構(gòu)性語句:根據(jù)程序的運(yùn)行狀態(tài)、輸入數(shù)據(jù)、變量的取值、控制信號(hào)以及運(yùn)行時(shí)間等因素來控制程序的運(yùn)行流程。 主要包括條件測(cè)試語句、多路分支語句、循環(huán)語句、循環(huán)控制語句和后臺(tái)執(zhí)行語句等
測(cè)試語句:test語句可測(cè)試字符串、整數(shù)和文件屬性
test "$answer" = "yes" #變量answer的值是否為字符串yes
test $num –eq 18 #變量num的值是否為整數(shù)18
test -d tmp #測(cè)試tmp是否為一個(gè)目錄名
##### 字符串測(cè)試 #####
s1 = s2 #測(cè)試兩個(gè)字符串的內(nèi)容是否完全一樣
s1 != s2 #測(cè)試兩個(gè)字符串的內(nèi)容是否有差異
-z s1 #測(cè)試s1字符串的長度是否為0
-n s1 #測(cè)試s1字符串的長度是否不為0
##### 整數(shù)測(cè)試 #####
a -eq b #測(cè)試a與b是否相等
a -ne b #測(cè)試a與b是否不相等
a -gt b #測(cè)試a是否大于b
a -ge b #測(cè)試a是否大于等于b
a -lt b #測(cè)試a是否小于b
a -le b #測(cè)試a是否小于等于b
##### 文件測(cè)試 #####
-d name #測(cè)試name是否為一個(gè)目錄
-e name #測(cè)試一個(gè)文件是否存在
-f name #測(cè)試name是否為普通文件
-L name #測(cè)試name是否為符號(hào)鏈接
-r name #測(cè)試name文件是否存在且為可讀
-w name #測(cè)試name文件是否存在且為可寫
-x name #測(cè)試name文件是否存在且為可執(zhí)行
-s name #測(cè)試name文件是否存在且其長度不為0
f1 -nt f2 #測(cè)試文件f1是否比文件f2更新
f1 -ot f2 #測(cè)試文件f1是否比文件f2更舊
條件語句
if [condition1]; then
...
elif [condition2]; then
...
else
...
fi
多路分支語句
case $variable in
"case1")
......
;;
"case2")
......
;;
"case3")
......
;;
*)
......
;;
esac
循環(huán)語句
for var in con1 con2 con3 ...
do
......
done
while [condition]
do
......
done
循環(huán)控制語句
break #終止執(zhí)行所有循環(huán)
continue #終止該次循環(huán),進(jìn)行下次循環(huán)
4. shell函數(shù)
把一個(gè)功能封裝起來,使用時(shí)直接調(diào)用函數(shù)名,模塊化,代碼可讀性強(qiáng),擴(kuò)展性方便。 shell中有兩種定義函數(shù)的語法格式:
# 若寫了function,可以省略函數(shù)名后的括號(hào)
function fname {
......
}
# 不寫function時(shí),函數(shù)名后需要加括號(hào)
fname() {
......
}
和其他編程語言不同的是,shell函數(shù)在定義時(shí)不能指明參數(shù),但在調(diào)用時(shí)卻可以傳遞參數(shù),并且給它傳遞什么參數(shù)它就接收什么參數(shù)。 當(dāng)然調(diào)用函數(shù)時(shí)也可以不傳遞參數(shù)。 函數(shù)調(diào)用方法如下:
# 不傳遞參數(shù)時(shí),直接給出函數(shù)名即可
fname
# 如果要傳遞參數(shù),多個(gè)參數(shù)之間以空格分開
fname param1 param2 param3
如下函數(shù)調(diào)用實(shí)例1:運(yùn)行腳本后,輸出www.baidu.com
#!/bin/bash
#定義函數(shù)
function url {
echo "www.baidu.com"
}
#調(diào)用函數(shù)
url
如下函數(shù)調(diào)用實(shí)例2:運(yùn)行腳本后,輸出傳參值之和
#!/bin/bash
#定義函數(shù):獲取參數(shù)的和
function get_sum() {
local sum=0
for n in $@
do
((sum+=n))
done
return $sum
}
#調(diào)用函數(shù)并傳遞參數(shù)
get_sum 10 2 5 7 9 12 50
echo $?
-
編程
+關(guān)注
關(guān)注
90文章
3722瀏覽量
97380 -
程序
+關(guān)注
關(guān)注
117文章
3847瀏覽量
85402 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4419瀏覽量
67753 -
Shell
+關(guān)注
關(guān)注
1文章
375瀏覽量
25460 -
腳本
+關(guān)注
關(guān)注
1文章
411瀏覽量
29261
發(fā)布評(píng)論請(qǐng)先 登錄
Shell基礎(chǔ)知識(shí)(上)
Shell腳本編程實(shí)驗(yàn)
嵌入式和物聯(lián)網(wǎng)的shell腳本學(xué)習(xí)指南之shell腳本入門免費(fèi)下載
shell腳本最簡(jiǎn)明的教程
109個(gè)實(shí)用shell腳本分享
Linux開發(fā)_Makefile規(guī)則與Shell腳本語言
shell腳本基礎(chǔ)知識(shí)匯總1
shell腳本基礎(chǔ)知識(shí)匯總2
shell腳本基礎(chǔ)知識(shí)匯總3
shell腳本基礎(chǔ)知識(shí)匯總4
Linux Shell腳本經(jīng)典案例分享
樹莓派新手必看!在樹莓派上編寫和運(yùn)行 Shell 腳本!
shell腳本基礎(chǔ)知識(shí)
評(píng)論