企業(yè)網(wǎng)站模板優(yōu)化寧波seo排名外包公司
文章目錄
- 第一章 Shell編程【重點(diǎn)】
- 1.1. Shell的概念介紹
- 1.1.1. 命令解釋器
- 4.1.1.2. Shell腳本
- 1.2. Shell編程規(guī)范
- 1.2.1. 腳本文件的結(jié)構(gòu)
- 1.2.2. 腳本文件的執(zhí)行
- 1.3. Shell的變量
- 1.3.1. 變量的用法
- 1.3.2. 變量的分類(lèi)
- 1.3.3. 局部變量
- 1.3.4. 環(huán)境變量
- 1.3.5. 位置參數(shù)變量
- 1.3.6. 預(yù)定義變量
- 1.4. read命令
- 1.4.1. 命令說(shuō)明
- 1.4.2. read的實(shí)例
- 1.4.3. 注意事項(xiàng)
- 1.5. 運(yùn)算
- 1.5.1. expr
- 1.5.2. 示例
- 1.5.3. {}
- 1.6. 字符串
- 1.6.1. 字符串的腳本用法
- 1.6.2. 字符串的長(zhǎng)度
- 1.7. Shell數(shù)組
- 1.7.1. 數(shù)組的使用規(guī)則
- 1.7.2. 數(shù)組的定義
- 1.7.3. 讀取數(shù)組
- 1.8. test測(cè)試命令
第一章 Shell編程【重點(diǎn)】
1.1. Shell的概念介紹
1.1.1. 命令解釋器
Shell是命令解釋器(command interpreter),是Unix操作系統(tǒng)的用戶(hù)接口,程序從用戶(hù)接口得到輸入信息,shell將用戶(hù)程序及其輸入翻譯成操作系統(tǒng)內(nèi)核(kernel)能夠識(shí)別的指令,并且操作系統(tǒng)內(nèi)核執(zhí)行完將返回的輸出通過(guò)shell再呈現(xiàn)給用戶(hù),下圖所示用戶(hù)、shell和操作系統(tǒng)的關(guān)系:
一個(gè)系統(tǒng)可以存在多個(gè)shell,可以通過(guò)cat /etc/shells命令查看系統(tǒng)中安裝的shell。
[root@qianfeng01 ~]# cat /etc/shells/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
操作系統(tǒng)內(nèi)核(kernel)與shell是獨(dú)立的套件,而且都可被替換;不同的操作系統(tǒng)使用不同的shell; 同一個(gè)kernel之上可以使用不同的shell。 也可以查看當(dāng)前shell環(huán)境是哪種:
[root@qianfeng01 ~]# echo $SHELL
4.1.1.2. Shell腳本
Shell也是一門(mén)編程語(yǔ)言,即shell腳本。在此腳本中,我們可以使用一些編程語(yǔ)法來(lái)進(jìn)行一些任務(wù)操作。 如:變量、類(lèi)型、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、數(shù)組、函數(shù)等語(yǔ)法。 在shell腳本里,必須指定一種shell命令解釋器。
1.2. Shell編程規(guī)范
1.2.1. 腳本文件的結(jié)構(gòu)
1 文件的擴(kuò)展名必須是.sh
2 文件的首行必須使用#! 指定script的運(yùn)行shell環(huán)境(即腳本解釋器)如:#!/bin/bash
3 腳本里的行注釋符號(hào)為#
4 指令、選項(xiàng)、參數(shù)之間即使有多個(gè)空格仍會(huì)被視為一個(gè)空格。
5 tab鍵形成的空白也被視為一個(gè)空格鍵
6 空白行會(huì)被忽略
1.2.2. 腳本文件的執(zhí)行
-
使用bash程序調(diào)用執(zhí)行,只需要有讀權(quán)限即可
[root@qianfeng01 ~]# sh *.sh 或者 [root@qianfeng01 ~]# bash *.sh
-
直接寫(xiě)script,必須要有rx權(quán)限才行
[root@qianfeng01 ~]# ./*.sh 絕對(duì)路徑寫(xiě)法: /hadoop/*.sh 相對(duì)路徑寫(xiě)法: ./*.sh
-
借助變量PATH功能
將*.sh放入~/bin目錄下,因?yàn)镻ATH里拼接了~/bin目錄。 注意:~/bin目錄必須自行創(chuàng)建
1.3. Shell的變量
1.3.1. 變量的用法
1. 變量的命名規(guī)則 - 命名只能使用英文字母,數(shù)字和下劃線(xiàn)。首個(gè)字符不能以數(shù)字開(kāi)頭。- 字母習(xí)慣使用大寫(xiě)。- 中間不能有空格。- 不能使用標(biāo)點(diǎn)符號(hào)。- 不能使用bash里的關(guān)鍵字(可用help命令查看保留關(guān)鍵字)2. 變量的使用規(guī)則- 直接定義變量名稱(chēng),沒(méi)有類(lèi)型需要強(qiáng)調(diào)(類(lèi)似于數(shù)學(xué)中:x=1,y=2,z=x+y)- 賦值時(shí),"="前后不能有空格- 命令的執(zhí)行結(jié)果賦值給變量時(shí),使用反單引號(hào) 如:TIME=`date`- 調(diào)用變量時(shí),必須使用$ 格式: $變量名 或 ${變量名}
1.3.2. 變量的分類(lèi)
Linux Shell中的變量可以分為三種變量: 局部變量、環(huán)境變量、特殊變量。可以通過(guò)set
命令查看系統(tǒng)中存在的所有變量
局部變量:也就是用戶(hù)自定義的變量,在腳本中或命令中定義
環(huán)境變量:保存和系統(tǒng)操作環(huán)境相關(guān)的數(shù)據(jù)。$HOME、$PWD、$SHELL、$USER等等
特殊變量:一種是位置參數(shù)變量:主要用來(lái)向腳本中傳遞參數(shù)或數(shù)據(jù),變量名不能自定義,變量作用固定。一種是預(yù)定義變量:是Bash中已經(jīng)定義好的變量,變量名不能自定義,變量作用也是固定的。
1.3.3. 局部變量
用戶(hù)自定義的變量由字母或下劃線(xiàn)開(kāi)頭,由字母,數(shù)字或下劃線(xiàn)序列組成,并且大小寫(xiě)字母意義不同,變量名長(zhǎng)度沒(méi)有限制。
-
定義變量
習(xí)慣上用大寫(xiě)字母來(lái)命名變量。變量名以字母表示的字符開(kāi)頭,不能用數(shù)字。
-
調(diào)用變量
在使用變量時(shí),要在變量名前加上前綴“$”. 使用echo 命令查看變量值 eg: [root@qianfeng01 ~]# echo $A
-
變量賦值
-
第一種: 定義時(shí)賦值
# 變量=值 # 注意: 在上述的定義方式中,等號(hào)的左右兩側(cè)不能有空格 # eg: [root@qianfeng01 ~]# STR="hello qianfeng" [root@qianfeng01 ~]# A=9
-
第二種: 將一個(gè)命令的執(zhí)行結(jié)果給變量賦值
[root@qianfeng01 ~]# A=`ls -la` 反引號(hào),運(yùn)行里面的命令,并把結(jié)果返回給變量A [root@qianfeng01 ~]# A=$(ls -la) 等價(jià)于反引號(hào) [root@qianfeng01 ~]# AA=$((4+5)) [root@qianfeng01 ~]# BB=`expr 4 + 5 `
-
第三種: 將一個(gè)變量的值賦給另一個(gè)變量
[root@qianfeng01 ~]# A=$STR
-
-
變量疊加
# 變量疊加,就是將兩個(gè)字符串變量的值疊加在一起,類(lèi)似于Java中的字符串拼接操作。[root@qianfeng01 ~]# A=123 [root@qianfeng01 ~]# C="$A"456 [root@qianfeng01 ~]# D=${A}789# 單引號(hào)和雙引號(hào)的區(qū)別 # 現(xiàn)象:單引號(hào)里的內(nèi)容會(huì)全部輸出,而雙引號(hào)里的內(nèi)容會(huì)有變化 # 原因:單引號(hào)會(huì)將所有特殊字符脫意[root@qianfeng01 ~]# NUM=10 [root@qianfeng01 ~]# SUM="$NUM hehe" [root@qianfeng01 ~]# echo $SUM # 輸出10 hehe[root@qianfeng01 ~]# SUM2='$NUM hehe' [root@qianfeng01 ~]# echo $SUM2 # 輸出$NUM hehe
-
刪除變量
# 刪除之前已經(jīng)定義過(guò)的變量,之后就無(wú)法再使用這個(gè)變量了。# 撤銷(xiāo)變量 A [root@qianfeng01 ~]# unset A # 聲明靜態(tài)的變量 B=2 ,不能 unset [root@qianfeng01 ~]# readonly B=2 # 報(bào)錯(cuò): -bash: unset: B: cannot unset: readonly variable [root@qianfeng01 ~]# unset B
-
注意事項(xiàng)
關(guān)于局部變量的作用域的問(wèn)題: 用戶(hù)自定義的局部變量,作用于僅為當(dāng)前的Shell環(huán)境。僅在當(dāng)前的Shell示例中有效,其他的Shell啟動(dòng)的程序不能訪(fǎng)問(wèn)局部變量。
[root@qianfeng01 ~]# echo '#!/bin/bash' > test.sh [root@qianfeng01 ~]# A=22 [root@qianfeng01 ~]# echo 'echo $A' >> test.sh [root@qianfeng01 ~]# echo $A 結(jié)果:22 [root@qianfeng01 ~]# bash test.sh 結(jié)果:打印為空,因?yàn)閎ash會(huì)開(kāi)啟新的shell進(jìn)程
1.3.4. 環(huán)境變量
用戶(hù)自定義的局部變量,只能在當(dāng)前的Shell中生效,而環(huán)境變量會(huì)在當(dāng)前Shell和其所有的子Shell中生效。如果把環(huán)境變量寫(xiě)入相應(yīng)的配置文件,那么這個(gè)環(huán)境變量就會(huì)在所有的Shell中生效。
作用域: 當(dāng)前的Shell以及所有的子Shell
聲明變量: export 變量名=變量值
定義環(huán)境變量的常見(jiàn)配置文件:
- /etc/profile -> 針對(duì)系統(tǒng)所有的用戶(hù)生效,此文件應(yīng)用于所有用戶(hù)每次登錄系統(tǒng)時(shí)的環(huán)境變量定義。每次用戶(hù)登錄的時(shí)候,都會(huì)加載這個(gè)文件。
- $HOME/.bash_profile -> 針對(duì)特定用戶(hù)生效,HOME/.bash_profile文件中的定義。
1.3.5. 位置參數(shù)變量
變量 | 描述 |
---|---|
0表示命令本身,9表示第1到第9個(gè)參數(shù),10以上的參數(shù)需要使用大括號(hào)包含,例如${10} | |
1 n"的形式輸出所有參數(shù) | |
1" “n” 的形式輸出所有參數(shù) | |
$# | 參數(shù)的個(gè)數(shù) |
-
@ 的區(qū)別
- 他們都表示傳遞給函數(shù)或腳本的所有參數(shù),不被雙引號(hào)包含時(shí),都以
"$1""$2""$3"..."$n"
的形式輸出所有參數(shù)。 - 當(dāng)他們被雙引號(hào)包含時(shí)
- "$*"會(huì)將所有的參數(shù)作為一個(gè)整體,以
$1 $2 $3 ... $n
的形式輸出所有的參數(shù)。 - "$@"會(huì)將各個(gè)參數(shù)分開(kāi),以
"$1""$2""$3"..."$n"
的形式輸出所有參數(shù)。
- "$*"會(huì)將所有的參數(shù)作為一個(gè)整體,以
- 他們都表示傳遞給函數(shù)或腳本的所有參數(shù),不被雙引號(hào)包含時(shí),都以
-
Shell腳本執(zhí)行測(cè)試
# 執(zhí)行腳本 test1.sh #!/bin/bash echo "test \$*" for i in $* doecho $i doneecho "test \$@" for i in $@ doecho $i doneecho "test \"\$*\"" for i in "$*" doecho $i doneecho "test \"\$@\"" for i in "$@" doecho $i done輸出結(jié)果: [root@qianfeng01 ~]# sh test1.sh a b test $* a b test $@ a b test "$*" a b test "$@" a b
1.3.6. 預(yù)定義變量
變量 | 描述 |
---|---|
$? | 執(zhí)行上一個(gè)命令的返回值。執(zhí)行成功,返回0;執(zhí)行失敗,返回非0 |
$$ | 當(dāng)前進(jìn)程的進(jìn)程號(hào)(PID),即當(dāng)前腳本執(zhí)行時(shí)生成的進(jìn)程號(hào) |
$! | 后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的進(jìn)程號(hào)(PID),最近一個(gè)被放入后臺(tái)執(zhí)行的進(jìn)程 |
-
測(cè)試 $?
[root@qianfeng01 ~]# ls ; echo $? # 分析: 這里的意思是依次順序執(zhí)行兩個(gè)命令 # 如果分號(hào)前的命令可以執(zhí)行,$?會(huì)返回0; 否則會(huì)返回非0的一個(gè)數(shù)字
-
測(cè)試 $$
[root@qianfeng01 ~]# pwd > /dev/null [root@qianfeng01 ~]# echo $$
-
測(cè)試 $!
[root@qianfeng01 ~]# ls /etc > /dev/null & [root@qianfeng01 ~]# echo $!
1.4. read命令
1.4.1. 命令說(shuō)明
read命令,可以從控制臺(tái)讀取用戶(hù)輸入的內(nèi)容,并且給指定的變量進(jìn)行賦值。
命令的基本格式為: read [option] variable
常見(jiàn)的option:
-p : 提示語(yǔ)句,在輸入之前,給用戶(hù)提示的信息
-n : 限制輸入的字符數(shù)量,到達(dá)這個(gè)數(shù)量的字符的時(shí)候,會(huì)自動(dòng)的停止輸入
-t : 等待時(shí)間,單位為秒。當(dāng)?shù)竭_(dá)這個(gè)等待時(shí)間的時(shí)候,會(huì)自動(dòng)的結(jié)束輸入,并且不會(huì)讀取任何輸入的內(nèi)容!即,輸入操作且回車(chē),必須在指定的時(shí)間內(nèi)完成。
-s : 隱藏輸入的內(nèi)容。在控制臺(tái)上不顯示任何輸入的內(nèi)容,常見(jiàn)于密碼的輸入
1.4.2. read的實(shí)例
[root@qianfeng01 ~]# read -t 30 -p "please input your name:" NAME[root@qianfeng01 ~]# echo $NAME[root@qianfeng01 ~]# read -s -p "please input your age :" AGE[root@qianfeng01 ~]# echo $AGE 注意:如果隱藏輸入,這里的結(jié)果是看不到的[root@qianfeng01 ~]# read -n 1 -p "please input your sex [M/F]:" GENDER[root@qianfeng01 ~]# echo $GENDER
1.4.3. 注意事項(xiàng)
- 在輸入的時(shí)候,如果輸錯(cuò)了需要?jiǎng)h除的時(shí)候,執(zhí)行
ctrl+delete
- 符號(hào)不要輸入中文
- 變量與之前的內(nèi)容需要保持有空格
1.5. 運(yùn)算
1.5.1. expr
格式 :expr m + n 或$((m+n)) 注意expr與運(yùn)算符和變量間要有空格 sum=$((m+n)) 中=與$之間沒(méi)有空格expr命令:對(duì)整數(shù)型變量進(jìn)行算術(shù)運(yùn)算(注意:運(yùn)算符前后必須要有空格)[root@qianfeng01 ~]# expr 3 + 5 [root@qianfeng01 ~]# expr 3 – 5[root@qianfeng01 ~]# echo `expr 10 / 3` 10/3的結(jié)果為3,因?yàn)槭侨≌?span id="ieo6y2aa" class="token punctuation">[root@qianfeng01 ~]# expr 3 \* 10 \ 是轉(zhuǎn)義符
1.5.2. 示例
計(jì)算(2 +3 )×4 的值
1 .分步計(jì)算
[root@qianfeng01 ~]# S=`expr 2 + 3`[root@qianfeng01 ~]# expr $S \* 4
2.一步完成計(jì)算
[root@qianfeng01 ~]# expr `expr 2 + 3` \* 4
[root@qianfeng01 ~]# S=`expr \` expr 2 + 3 \` \* 4`
[root@qianfeng01 ~]# echo $S或
[root@qianfeng01 ~]# echo $(((2 + 3) * 4))
1.5.3. {}
$()與${}的區(qū)別$( )的用途和反引號(hào)``一樣,用來(lái)表示優(yōu)先執(zhí)行的命令eg: [root@qianfeng01 ~]# echo $(ls /root)${ } 就是取變量了 eg:[root@qianfeng01 ~]# echo ${PATH}$((運(yùn)算內(nèi)容)) 適用于數(shù)值運(yùn)算eg: [root@qianfeng01 ~]# echo $((3+1*4))
1.6. 字符串
1.6.1. 字符串的腳本用法
- 字符串不能單獨(dú)出現(xiàn),必須要配合變量。
- 字符串可以使用單引號(hào)[' '],也可以使用雙引號(hào)[" "],也可以不用引號(hào)
- 單引號(hào)內(nèi)的任何字符沒(méi)有任何意義,都會(huì)原樣輸出
- 單引號(hào)內(nèi)使用變量是無(wú)效的,單引號(hào)內(nèi)不能出現(xiàn)單引號(hào)
- 雙引號(hào)內(nèi)可以使用變量
- 雙引號(hào)內(nèi)可以使用轉(zhuǎn)義字符
- 在字符串拼接操作時(shí),我們可以進(jìn)行無(wú)縫拼接,或者是在雙引號(hào)里使用變量
1.6.2. 字符串的長(zhǎng)度
可以使用${#variable} 或者 expr length "${variable}"。因?yàn)閑xpr是指令,所以別忘記使用反單引號(hào)``或者是$()直接看案例:[root@qianfeng01 ~]# vim test3.sh#!/bin/bash
var='welcome to china'
length1=${#var}
length2=$(expr length "${var}") <==$()寫(xiě)法
length3=`expr length "$var"` <==反單引號(hào)寫(xiě)法
1.7. Shell數(shù)組
1.7.1. 數(shù)組的使用規(guī)則
- 在/bin/bash這個(gè)shell中,只有一維數(shù)組的概念,并且不限定數(shù)組的長(zhǎng)度。
- 數(shù)組的元素下標(biāo)是從0開(kāi)始的,
- 獲取數(shù)組的元素要使用下標(biāo)
- 下標(biāo)使用不當(dāng),會(huì)報(bào)錯(cuò)
1.7.2. 數(shù)組的定義
定義格式: variable=(值1 值2 … 值n)
注意:元素之間除了使用空格作為分隔符,還可以使用換行符?;蛘?name[0]=值1
name[1]=值2
…
name[n]=值n
1.7.3. 讀取數(shù)組
${variable[index]}: 讀取index索引上的元素
${variable[*]}或者${variable[@]}:讀取所有元素
${#variable[*]}或者${#variable[@]} : 讀取數(shù)組的長(zhǎng)度
[root@qianfeng01 ~]# vim test3.sh#!/bin/bash
citys=(cc sh bj sd hlj)
hobby[0]=book
hobby[1]=film
hobby[2]=musicecho ${citys[0]} <==cc
echo ${hobby[*]} <==book film music
echo ${#hobby[@]} <==3
[root@qianfeng01 ~]# bash test3.sh
1.8. test測(cè)試命令
-
通常test命令不單獨(dú)使用,而是與if語(yǔ)句連用,或是放在循環(huán)結(jié)構(gòu)中
# && 表示測(cè)試通過(guò)的處理邏輯 # || 表示測(cè)試不通過(guò)的處理邏輯 [root@qianfeng01 ~]# test -e file && echo "exists" || echo "not exists"
-
判斷符號(hào)[]
除了好用的test之外,我們還可以使用中括號(hào)來(lái)進(jìn)行檢測(cè)條件是否成立
[root@qianfeng01 ~]# [ -r filename ] 檢測(cè)filename是否有可讀權(quán)限 [root@qianfeng01 ~]# [ -f filename -a -r filename ] 檢測(cè)filename是不是普通文件并且有可讀權(quán)限