shell编程快速入门(一)
shell腳本書寫規(guī)范
shell腳本編程規(guī)范與書寫習(xí)慣
1.開頭加腳本解釋器 2.附帶作者及版權(quán)信息 3.腳本擴(kuò)展名為 *.sh 4.腳本存放在固定的目錄下 5.腳本盡量不使用中文 6.成對的符號 一次性書寫完成 7.循環(huán)格式一次輸入完成 8.中括號首尾要有一個空格shell腳本的注釋
# 后面的的內(nèi)容一般為注釋,可以使用vim 命令模式ctrl+v 可視化模塊添加。也可以使用如下方法: :<<EOF 需要注釋的內(nèi)容 EOF注:結(jié)尾的EOF必須從行首寫,不能有空格, :冒號在shell中也是命令,表示深度不做。例如: #!/bin/bash echo "123" :<<EOF echo "234" echo "345" EOFshell腳本的執(zhí)行
1.當(dāng)腳本每可執(zhí)行權(quán)限或腳本開頭文件沒有指定解釋器時推薦使用: bash script_name sh script_name2.指定當(dāng)前路徑下執(zhí)行腳本(腳本需要有執(zhí)行權(quán)限) chmod +x script_name 再執(zhí)行 /path/script_name ./script_name3.其他 cat script_name | sh source script_name sh < script_name . script_name父shell和子shell的概念
在A腳本運(yùn)行b腳本,那么可以稱b為A的子shell,A為父shell。 父shell和子shell之間是不能調(diào)用的,若需要調(diào)用變量需要使用source或 . 點。例如: [root@m01 scripts]# cat 2.sh #!/bin/bash user=`whoami` [root@m01 scripts]# sh 2.sh [root@m01 scripts]# echo $user [root@m01 scripts]# user=`whoami` [root@m01 scripts]# echo $user root [root@m01 scripts]# unset user [root@m01 scripts]# echo $user[root@m01 scripts]# # 使用source調(diào)用是可以讀取到變量的 [root@m01 scripts]# source 2.sh [root@m01 scripts]# echo $user root總結(jié): 使用source 和 . 點來執(zhí)行腳本,相當(dāng)于在shell下面執(zhí)行腳本,變量互相可以調(diào)用。 bash和sh執(zhí)行腳本,等于開啟了一個新的shell,或者說開啟了一個子shell,無法讀取父定義的變量。declare命令
聲明變量,設(shè)置或顯示變量的值和屬性
例: 聲明變量 [root@m01 scripts]# declare B=aaa [root@m01 scripts]# echo $B aaaunset命令
刪除指定shell變量或函數(shù)
參數(shù): -f 僅刪除函數(shù) -v 僅山粗變量(不包括只讀變量) -n 刪除具有引用屬性的變量名(如果該選項存在)案例: [root@m01 scripts]# a=123 [root@m01 scripts]# echo $a 123 [root@m01 scripts]# unset a #刪除指定shell變量 [root@m01 scripts]# echo $a[root@m01 scripts]#set命令
顯示或設(shè)置特殊及shell變量。
set命令注意作用是顯示系統(tǒng)中已經(jīng)存在的shell變量,以及設(shè)置shell變量的新變量值。set命令不能定義新的shel變量,如有要定義新的變量可以使用declare命令以 “變量名=值” 的格式定義。參數(shù): -a 標(biāo)示以修改的變量,以供輸出值環(huán)境變量 -f 取消使用通配符 -n 只讀指令,而不實際執(zhí)行例: [root@m01 scripts]# set |grep LANG LANG=en_US.UTF-8env命令
顯示系統(tǒng)中已存在的環(huán)境變量
例: 過濾系統(tǒng)環(huán)境變量 [root@m01 scripts]# env |grep LANG LANG=en_US.UTF-8tee命令
從標(biāo)注輸入讀取數(shù)據(jù)并重定向到標(biāo)準(zhǔn)輸出和文件;要食醋胡的文件可以是一個或多個。
參數(shù): -a 追加到文件中而不是覆蓋案例: 將信息通過管道符輸出到標(biāo)準(zhǔn)輸出并覆蓋寫入到文件中,加-a參數(shù)是追加而不是覆蓋 [root@m01 scripts]# cat 2.sh | tee 2.txt #!/bin/bash user=`whoami` [root@m01 scripts]# cat 2.txt #!/bin/bash user=`whoami`readonly命令
標(biāo)記shell變量或函數(shù)為只讀
主要用途: 定義一個到多個變量并設(shè)置為只讀屬性 顯示全部包含只讀屬性的變量/函數(shù)參數(shù): -a 指向數(shù)組 -A 指向關(guān)聯(lián)數(shù)組 -f 指向函數(shù) -p 顯示全部只讀變量 -- 在它之后的選項無效只讀變量:是指不能被清除或重新賦值的變量。declare無法去除只讀屬性,unset不能刪除只讀變量。案例: 標(biāo)記變量為只讀變量 [root@m01 scripts]# A=XXX [root@m01 scripts]# readonly A [root@m01 scripts]# A=yyy -bash: A: readonly variable [root@m01 scripts]# unset A=yyy -bash: unset: `A=yyy': not a valid identifier刪除只讀變量 cat << EOF| gdb attach $$ call unbind_variable("變量名") detach EOF變量知識
什么是變量
變量源自數(shù)學(xué),是計算機(jī)語言中能存儲計算結(jié)果或能表示值的抽象概念。shell變量特性
默認(rèn)情況下,在bash shell中是不會區(qū)分變量是什么類型的,如:常見的變量類型為整數(shù),字符串,小數(shù)等。shell變量分類
變量可以分為兩類: 環(huán)境變量(全局變量):可以在創(chuàng)建他們的shell及其派生出來的任意子進(jìn)程中使用,環(huán)境變量又可以分為自定義環(huán)境變量和bash內(nèi)置環(huán)境變量。 普通變量(局部變量):只能在創(chuàng)建他們的shell函數(shù)或shell腳本中使用,普通變量一般由開發(fā)者在開發(fā)腳本程序是創(chuàng)建。定義環(huán)境變量
如:PS1;PATH;HOME;UID等系統(tǒng)固有的,默認(rèn)就表示一定的意義。系統(tǒng)級:/etc/profile /etc/bashrc 用戶級:~/.bash_profile ~/.bashrc ~/.bash_logout ~/.bash_history設(shè)置環(huán)境變量有三種方法: 第一種: export A=1 第二種: B=2 export B 第三種: declare -x C=3總結(jié): 定義環(huán)境變量盡量大寫; 使環(huán)境變量全局生效,可以寫入/etc/profile文件中。 顯示環(huán)境變量使用env和set命令 取消環(huán)境變量是 unset + 變量名1 變量名2 ...定義永久變量
本地變量:用戶私有變量,只有本用戶可以使用,保存在家目錄下的.bash_profile,.bashrc文件中 全局變量:所有用戶都可以使用,保存在/etc/profile,/etc/bashrc文件中例如: 本地變量 [root@www ~]# tail -1 ~/.bash_profile name='ccc'全局變量 [root@www ~]# tail -1 /etc/profile export age=18環(huán)境變量初始化與對于文件生效順序
先加載/etc/profile;然后加載~/.bash_profile;再加載~/.bashrc;最后加載/etc/bashrc普通變量(局部變量)
當(dāng)前用戶或腳本種生效,離開當(dāng)前用戶或腳本失效。
變量名: 規(guī)則:字母,數(shù)字,下劃線,三種組合,以字母開頭,中間不能有空格,不能使用數(shù)字開頭。 要求:見名知意 駝峰語法:首個單詞字母小寫,其余單詞首字母大寫。 例如: MyAge=18 my_age=18 myAge=18變量內(nèi)容: 字符串: 變量名=value #不加引號,解析變量或者命令,然后輸出,出數(shù)字選擇不加引號,value 值。 變量名='value' #加單引號,所見即所得 變量="value" #加雙引號,解析變量或命令,然后輸出,字符串默認(rèn)選擇雙引號,可以把要定義的內(nèi)容作為一個整體。命令變量: 變量名=`ls` 變量名=$(ls)普通變量定義及輸出小結(jié): 變量名: 1)變量名定義要有一定的命令規(guī)范,并且要見名知意,推薦使用駝峰語法,myAge=18 2)變量名僅能使用字母,數(shù)字,下劃線中的任意多個字符,并且盡量以字母開頭變量內(nèi)容: 在腳本中定義普通字符串變量,盡量把變量的內(nèi)容用雙引號括起來 單純數(shù)字的變量內(nèi)容可以不加引號 希望變量的內(nèi)容原樣輸出加單引號 希望變量值引用命令并且獲取命令結(jié)果使用反引號或$()賦值符號: 變量定義是賦值符號(=),賦值符號兩端不要有空格變量輸出: 使用或輸出變量的內(nèi)容可以使用$變量名,例:echo $變量名 若變量名后面有其他字符連接的時候,就必須給變量加上大括號{};例如:$db_t 就要改寫成${db}_特殊重要變量
特殊位置參數(shù)變量
| $0 | 獲取當(dāng)前執(zhí)行shell腳本的文件名,如果執(zhí)行腳本帶路徑,那么就包括腳本路徑 |
| $n | 獲取當(dāng)前執(zhí)行的shell腳本的第n個參數(shù)值,n=1…9,當(dāng)n為0時如上;如果n>9,則大括號括起來,如${10},這樣才能代表第10個參數(shù) |
| $# | 獲取當(dāng)前執(zhí)行的shell腳本后面接的參數(shù)的總個數(shù) |
| $* | 獲取當(dāng)前shell腳本所有傳參的參數(shù),不加引號同 @ ; 如 果 給 @;如果給 @;如果給*加上雙引號,例如: "$*",則表示將所有的參數(shù)視為單個字符串,相當(dāng)于"$1 $2 $3" |
| $@ | 獲取當(dāng)前shell腳本所有傳參的參數(shù),不加引號同 ? , 如 果 給 * ,如果給 ?,如果給@加上雙引號,例如:"$@",則表示將所有的參數(shù)視為不同的獨(dú)立字符串,相當(dāng)于"$1" “$2” “ 3 " " . . . " , 這 是 將 多 參 數(shù) 傳 遞 給 其 他 程 序 的 最 佳 方 式 , 因 為 它 會 保 留 所 有 內(nèi) 嵌 的 每 個 參 數(shù) 里 的 任 何 空 白 。 當(dāng) " 3" "...",這是將多參數(shù)傳遞給其他程序的最佳方式,因為它會保留所有內(nèi)嵌的每個參數(shù)里的任何空白。當(dāng)" 3""...",這是將多參數(shù)傳遞給其他程序的最佳方式,因為它會保留所有內(nèi)嵌的每個參數(shù)里的任何空白。當(dāng)"@“和”$*” 都加上雙引號時,二者有區(qū)別,都不加雙引號,二者無區(qū)別。 |
shell變量字串知識及實踐
| ${parameter} | 返回變量$parametert的內(nèi)容 |
| ${#parameter} | 返回變量$parameter內(nèi)容的長度(按字符),也適合特殊變量 |
| ${parameter:offset} | 在變量${parameter}中,從位置offset之后開始提取子串到結(jié)尾 |
| ${parameter:offset:length} | 在變量${parameter}中,從位置offset之后開始提取長度未length的子串 |
| ${parameter#word} | 從變量${parameter}開頭開始刪除最短匹配的word子串 |
| ${parameter##word} | 從變量${parameter}開頭開始刪除最長匹配的word子串 |
| ${parameter%word} | 從變量${parameter}結(jié)尾開始刪除最短匹配的word子串 |
| ${parameter%%word} | 從變量${parameter}結(jié)尾開始刪除最長匹配的word子串 |
| ${parameter/pattern/string} | 使用string代替第一個匹配的pattern |
| ${parameter//pattern/string} | 使用string代替所有匹配的pattern |
變量內(nèi)容"子串"的刪除和替換(重點)
====內(nèi)容的刪除==== [root@m01 ~]# url=www.sina.com.cn 1.${parameter}案例:獲取變量內(nèi)容 [root@m01 ~]# echo ${url} www.sina.com.cn2.${#parameter}案例:獲取變量值的長度 [root@m01 ~]# echo ${#url} 15====索引切片==== 3.${parameter:offset}案例:在變量${parameter}中,從位置offset之后開始提取子串到結(jié)尾 [root@m01 ~]# echo ${url:2} w.sina.com.cn [root@m01 ~]# echo ${url:3} .sina.com.cn4.${parameter:offset:length}案例:從變量${parameter}中從位置offset之后開始提取長度未length的子串 [root@m01 ~]# echo ${url:3:4} .sin [root@m01 ~]# echo ${url:1:3} ww.5.${parameter#word}案例:從變量${parameter}開頭刪除最短匹配的word子串 [root@m01 ~]# echo ${url#*.} sina.com.cn [root@m01 ~]# echo ${url#*c} om.cn6.${parameter##word}案例:${parameter}開頭刪除最長匹配的word子串 [root@m01 ~]# echo ${url##*.} cn [root@m01 ~]# echo ${url##*c} n#發(fā)現(xiàn)沒有刪除內(nèi)容,是因為從前往后,a.之前還有內(nèi)容,寫法錯誤,所以無法刪除 [root@m1 ~]$ echo ${url#a.} www.sina.com.cn [root@m1 ~]$ echo ${url#*a.} 這樣寫就可以了 com.cn7.${parameter%word}案例:從變量${parameter}`結(jié)尾`開始刪除`最短`匹配的word子串 [root@m01 ~]# echo ${url%cn} www.sina.com. [root@m01 ~]# echo ${url%.*} www.sina.com [root@m01 ~]# echo ${url%m.cn} www.sina.co8.${parameter%%word}案例:從變量${parameter}`結(jié)尾`開始刪除`最長`匹配的word子串 [root@m01 ~]# echo ${url%%.*} www對比 [root@m01 ~]# a=tianyun.1000phone.com [root@m01 ~]# echo ${a%.*} #匹配最短 tianyun.1000phone [root@m01 ~]# echo ${a%%.*} #匹配最長 tianyun===變量替換=== 9.${parameter/pattern/string}案例:使用string代替第一個匹配的pattern [root@m01 ~]# echo ${url/n/N} www.siNa.com.cn [root@m01 ~]# echo ${url/w/W} Www.sina.com.cn10.${parameter//pattern/string}案例:使用string代替所有匹配的pattern [root@m01 ~]# echo ${url//n/N} www.siNa.com.cN [root@m01 ~]# echo ${url//w/W} WWW.sina.com.cnshell特殊變量擴(kuò)展知識
${parameter:-word} 如果parameter變量值為空或未賦值,就返回word字符串替代變量的值。冒號是可以省略的。 用途:如果變量為定義,則返回備用值,防止變量為空值或未定義而導(dǎo)致異常。 例: [root@m01 ~]# result=${test:-test1} [root@m01 ~]# echo $test [root@m01 ~]# echo $result test1 [root@m01 ~]# echo $test [root@m01 ~]# #以上說明短橫線的作用:當(dāng)變量值為空時,短橫線后面的值會賦值給變量,當(dāng)不為空時,不能覆蓋原來的值 ${變量名-新的變量名} 變量沒有被賦值:會使用“新的變量值”替代 變量有被賦值(包括空值):不會被替代企業(yè)應(yīng)用:防止變量為空從根刪起--造成誤刪 find ${path:-/tmp} -name "*.log" -mtime +7|xargs rm -f [root@m01 ~]# find ${path:-/tmp} -name "*.log" /tmp/glances.log [root@m01 ~]# path=/opt [root@m01 ~]# find ${path:-/tmp} -name "*.log" [root@m01 ~]# touch /opt/c.log [root@m01 ~]# find ${path:-/tmp} -name "*.log" /opt/c.log${parameter:=word} 如果parameter變量值為空或未賦值,就設(shè)置這個變量值為word,并返回其值。位置變量和特殊變量不適用。 用途:基本同上一個${parameter:-word} ,但是又額外給parameter變量賦值了。 例: [root@m01 ~]# echo $test[root@m01 ~]# result=${test:=test1} [root@m01 ~]# echo $result test1 [root@m01 ~]# echo $test test1 #當(dāng)test值為空,test1的值不但會賦值給test還會賦值給result.${parameter:?word} 如果parameter變量值為空或未賦值,word字符串將被作為標(biāo)準(zhǔn)錯誤輸出,否則輸出變量的值。用途:用于捕捉由于變量未定義而導(dǎo)致的錯誤,并退出程序。 例如: [root@m01 ~]# result=${test2:?變量內(nèi)容為空} -bash: test2: 變量內(nèi)容為空 [root@m01 ~]# test2=xxx [root@m01 ~]# echo $test2 xxx [root@m01 ~]# result=${test2:?變量內(nèi)容為空} [root@m01 ~]# result=${test2:?變量內(nèi)容為空} #如果parameter值為空,就報錯,否則就輸出變量的值${parameter:+word}如果parameter變量值為空或未賦值,則什么都不做,否則word字符串替代變量的值。 例如: [root@m01 ~]# result1=${test3:+heihei} [root@m01 ~]# echo $result1[root@m01 ~]# echo $test3[root@m01 ~]# test3=333 [root@m01 ~]# result1=${test3:+heihei} [root@m01 ~]# echo $result1 heihei [root@m01 ~]# echo $test3 333 #意思就是test3值為空時,什么都不做,否則將值賦值給result1shell進(jìn)程特殊狀態(tài)變量
| $? | 獲取執(zhí)行上一個指令的執(zhí)行狀態(tài),返回值為0是成功,非0為失敗 |
| $$ | 或者當(dāng)前執(zhí)行的shell腳本的進(jìn)程號(PID)。(后面三個,了解即可) |
| $! | 獲取上一個在后臺工作的進(jìn)程的進(jìn)程號(PID) |
| $__ | 獲取在此之前執(zhí)行的命令或腳本的最后一個參數(shù) |
shell變量的數(shù)值計算實踐
expr命令
expr是一款便打算計算工具,使用它完成表達(dá)式的求值操作
expr的常用運(yùn)算:加減乘除,求模也就是取余運(yùn)算%。 更多用法參考:man expr1.在shell編程中,常用來判斷一個數(shù)是否為整數(shù)。 [root@m01 scripts]# cat test2.sh #!/bin/bash expr 2 + $1 &>/dev/null if [ $? -eq 0 ] thenecho "$1 is integer" elseecho "$1 is noninteger" fi [root@m01 scripts]# sh test2.sh 1 1 is integer [root@m01 scripts]# sh test2.sh 1.1 1.1 is noninteger2.通過expr判斷文件擴(kuò)展名 [root@m01 scripts]# cat expr1.sh #!/bin/bash expr "$1" : ".*\.txt" &>/dev/null if [ $? -eq 0 ] thenecho "$1 是文本" elseecho "$1 不是文本" fi [root@m01 scripts]# sh expr1.sh hh.txt hh.txt 是文本 [root@m01 scripts]# sh expr1.sh hh.html hh.html 不是文本3.通過expr計算字符串的長度 [root@m01 scripts]# char="I love linux and python" [root@m01 scripts]# expr length "$char" 23其他計算字符串長度的方法: [root@m01 scripts]# echo ${#char} 23 [root@m01 scripts]# echo ${char} |wc -L 23 # -L 打印最長行的長度[root@m01 scripts]# echo ${char} |awk '{print length(($0))}' 23[root@m01 scripts]# echo ${char} |awk '{print length}' 23算數(shù)運(yùn)算
| + - | 加法或正號;減法或負(fù)號 |
| * / % | 乘法;除法;取余(取模) |
| ** | 冪運(yùn)算 |
| ++ – | 增加及減少,可以前置也可以放在變量結(jié)尾,默認(rèn)步長為1 |
| ! && || | 邏輯非(取反);邏輯與(and);邏輯或(or) |
| < <= > >= | 比較符號,小于,小于等于,大于,大于等于 |
| == != = | 比較符號,相等,不相等,對于字符串"="也可以表示相等 |
| << >> | 向左位移,向右位移 |
| ~ | & ^ | 按位取反;按位異或;按位與;按位或 |
| = += -= *= /= %= | 賦值運(yùn)算,例如a+=1等同a=a+1,a-=1等同a=a-1 |
bash編程常見運(yùn)算命令匯總
| (()) | 用于整數(shù)運(yùn)算的常用運(yùn)算符,效率很高 |
| let | 用于整數(shù)運(yùn)算,類似(()) |
| expr | 可以用于整數(shù)運(yùn)算,還有其他的額外功能,如判斷是否為整數(shù) |
| bc | Linux下的一個計算器程序(適合整數(shù)以及小數(shù)運(yùn)算) |
| $[] | 用于整數(shù)運(yùn)算 |
| awk | 即可用于整數(shù)運(yùn)算,也可以用于小數(shù)運(yùn)算 |
| declare | 定義變量值和屬性,-參數(shù)可以用于定義整形變量,做運(yùn)算 |
特殊內(nèi)置命令read
從鍵盤讀取變量值,通常在shell腳本中與用戶交互的場合使用。該命令可以一次性讀取多個變量的值,變量和輸入的值都需要使用空格隔開。在read命令后面,如果沒有指定變量名,讀取的數(shù)據(jù)將被自動賦值給特定的變量REPLY。
參數(shù): -p 指定讀取值時的提示符 -t 指定讀取值時等待的時間,默認(rèn)單位秒 -s 不回顯 -n 輸入字符個數(shù)案例: [root@m01 scripts]# read -t 5 -p "請輸入一個數(shù)值:" a 請輸入一個數(shù)值:20 [root@m01 scripts]# echo $a 20shell案例 通過read方式讀入整數(shù)變量,計算兩個數(shù)的加減乘除冪模運(yùn)算 [root@m01 scripts]# cat read.sh #!/bin/bash read -p "請輸入兩個整數(shù):" a b echo "a+b=$(($a+$b))" echo "a+b=$(($a-$b))" echo "a+b=$(($a*$b))" echo "a+b=$(($a/$b))" echo "a+b=$(($a**$b))" echo "a+b=$(($a%$b))" [root@m01 scripts]# sh read.sh 請輸入兩個整數(shù):2 2 a+b=4 a+b=0 a+b=4 a+b=1 a+b=4 a+b=0也可以通過傳參的方式 [root@m01 scripts]# cat read1.sh #!/bin/bash a=$1 b=$2 echo "a+b=$(($a+$b))" echo "a+b=$(($a-$b))" echo "a+b=$(($a*$b))" echo "a+b=$(($a/$b))" echo "a+b=$(($a**$b))" echo "a+b=$(($a%$b))" [root@m01 scripts]# sh read1.sh 2 2 a+b=4 a+b=0 a+b=4 a+b=1 a+b=4 a+b=0擴(kuò)展1 [root@m01 scripts]# cat read.sh #!/bin/bash read -p "請輸入兩個整數(shù):" a b c if [ -z $a ] thenecho "error1:必須是兩個整數(shù)"exit elif [ -z $b ] thenecho "error2:必須是兩個整數(shù)"exit fiif [ -z $c ] thenexpr $a + $b + 3 &>/dev/nullif [ $? -eq 0 ]thenecho "a+b=$(($a+$b))"echo "a+b=$(($a-$b))"echo "a+b=$(($a*$b))"echo "a+b=$(($a/$b))"echo "a+b=$(($a**$b))"echo "a+b=$(($a%$b))"elseecho "輸入的不是整數(shù)"exitfi elseecho "error3:必須是兩個整數(shù)" fi [root@m01 scripts]# sh read.sh 請輸入兩個整數(shù):1 2 a+b=3 a+b=-1 a+b=2 a+b=0 a+b=1 a+b=1 [root@m01 scripts]# sh read.sh 請輸入兩個整數(shù):w 1 輸入的不是整數(shù) [root@m01 scripts]# sh read.sh 請輸入兩個整數(shù):2 e 輸入的不是整數(shù) [root@m01 scripts]# sh read.sh 請輸入兩個整數(shù):33 3 3 error3:必須是兩個整數(shù) [root@m01 scripts]# sh read.sh 請輸入兩個整數(shù):1 2 3 4 read.sh: line 13: [: 3: binary operator expected error3:必須是兩個整數(shù) [root@m01 scripts]# sh read.sh 請輸入兩個整數(shù):1 1.1 輸入的不是整數(shù)# 當(dāng)腳本較為繁雜時,就不適合使用read,但是read和用戶交互性較好。擴(kuò)展2,使用傳參的方式 [root@m01 scripts]# cat test.sh #!/bin/bash a=$1 b=$2 if [ $# -ne 2 ] thenecho "只能輸出兩個整數(shù)"exit 1 elseexpr $a + $b + 3 &>/dev/nullif [ $? -eq 0 ]thenecho "a+b=$(($a+$b))"echo "a+b=$(($a-$b))"echo "a+b=$(($a*$b))"echo "a+b=$(($a/$b))"echo "a+b=$(($a**$b))"echo "a+b=$(($a%$b))"elseecho "輸入的不是整數(shù)"exit 2fi fi [root@m01 scripts]# sh test.sh 1 2 a+b=3 a+b=-1 a+b=2 a+b=0 a+b=1 a+b=1 [root@m01 scripts]# sh test.sh 1 2 3 只能輸出兩個整數(shù) [root@m01 scripts]# sh test.sh w 2 3 只能輸出兩個整數(shù) [root@m01 scripts]# sh test.sh 1 w 3 只能輸出兩個整數(shù) [root@m01 scripts]# sh test.sh 1 2 e 只能輸出兩個整數(shù) [root@m01 scripts]# sh test.sh 1.1 2 輸入的不是整數(shù)關(guān)于cat<<EOF的使用方法
cat<<EOF是從標(biāo)準(zhǔn)輸入設(shè)備(一般為鍵盤)獲取輸入,在第二個EOF處結(jié)束輸入,同時輸出到輸出設(shè)備(一般為顯示器)。 例如: [root@m01 scripts]# [root@m01 scripts]# cat <<EOF > This is test file! > EOF This is test file! #結(jié)束的EOF必須是行首,否則被視為標(biāo)準(zhǔn)輸入而不是結(jié)束分解符。shell腳本的條件測試與比較
通常,在bash的各種條件結(jié)構(gòu)和流程控制中都要進(jìn)行各種測試,然后根據(jù)測試結(jié)果執(zhí)行不同的操作,有時也會與if等條件語句相結(jié)合,來完成測試判斷,減少程序運(yùn)行的錯誤,執(zhí)行測試條件表達(dá)式后通常會返回真或假,就像執(zhí)行命令后的返回值為0和非0表示真假一樣。
test命令
執(zhí)行條件表達(dá)式
參數(shù): 文件操作符 常用: -a FILE 如果文件存在,則為true -d FILE 如果文件是目錄,則為true -e FILE 如果文件存在,則為true -f FILE 如果文件存在且為普通文件,則為true -L FILE 如果文件是鏈接文件,則為true -r FILE 如果文件可以讀取,則為true -s FILE 如果文件存在且不為空(大小不為0),則為true -w FILE 如果文件可寫,則為true -x FILE 如果文件可以執(zhí)行,則為true常用字符串運(yùn)算符: -z STRING 如果字符串為空,則為true -n STRING 如果字符串不為空,則為true STRING 如果字符串不為空,則為true STRING1 = STRINFG2 如果字符串相等,則為true STRING != STRING2 如果字符串不相等,則為true文件比較: FILE1 -nt FILE2 根據(jù)修改日期,如果file1 比 file2 新,則為true FILE1 -ot FILE2 根據(jù)修改日期,如果file1 比 file2 舊,則為true FILE1 -ef FILE2 如果file1 為 file2的硬連接,則為true返回值:如果表達(dá)式執(zhí)行結(jié)果為成功時返回0,當(dāng)表達(dá)式執(zhí)行結(jié)果為失敗或給出非法參數(shù)時返回1。其他了解即可: 可參考:https://wangchujiang.com/linux-command/c/test.html 或者其他參考man 手冊案例: [root@m01 scripts]# test -a /etc/passwd [root@m01 scripts]# echo $? 0 [root@m01 scripts]# test -a /etc/passddd [root@m01 scripts]# echo $? 1六種條件測試語法
| test <測試表達(dá)式> | test命令和 "<測試表達(dá)式>"之間至少有一個空格 |
| [ <測試表達(dá)式> ] | 單中括號邊界和內(nèi)容至少有一個空格 |
| [[ <測試表達(dá)式> ]] | 雙中括號邊界和內(nèi)容之間至少有一個空格,比[]更新的語法格式;推薦使用 |
| ((<測試表達(dá)式>)) | 雙小括號一般用于if語句中,雙小括號兩端不需要有空格 |
| (<測試表達(dá)式>) | 小括號應(yīng)用較少,了解即可 |
| `<測試表達(dá)式>``` | 通過反引號實現(xiàn)測試條件表達(dá)式,應(yīng)用較少,了解即可 |
條件表達(dá)式的編程語法
[ <測試表達(dá)式> ] && 命令 如果前面的表達(dá)式成立,那么就執(zhí)行后面的命令[ <測試表達(dá)式> ] || 命令 如果前面的表達(dá)式不成立,那么就執(zhí)行后面的命令[ <測試表達(dá)式> ] && { 命令1 命令2 命令3 } 如果前面的表達(dá)式成立,那么就執(zhí)行后面的命令[ <測試表達(dá)式> ] && 命令1 ||命令2 如果前面的表達(dá)式成立,那么就執(zhí)行命令1,否則就執(zhí)行命令2[ <測試表達(dá)式> ] && { 命令1 命令2 } || { 命令3 命令4 } 如果表達(dá)式成立,那么就執(zhí)行命令1,2否則執(zhí)行命令3,4整數(shù)測試表達(dá)式
| -eq | ==或= | 相等全拼equal |
| -ne | != | 不相等全拼not equal |
| -gt | > | 大于 greater than |
| -ge | >= | 大于等于,greater equal |
| -lt | < | 小于,less than |
| -le | <= | 小于等于,less equal |
邏輯測試表達(dá)式
| -a | && | and,與,兩端都為真則真 |
| -o | || | or,或,兩端有一個為真則真 |
| ! | ! | not 非,相反則為真 |
條件表達(dá)式符號的語法對比
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-ielgGMYT-1614393493074)(https://i.loli.net/2021/02/20/hyTE6tzMZdkFWln.png)]
vim編程環(huán)境配置
[root@m01 ~]# pwd /root[root@m01 ~]# cat .vimrc set nocompatible set history=100 filetype on filetype plugin on filetype indent on set autoread set mouse=c syntax enable set cursorline hi cursorline guibg=#00ff00 hi CursorColumn guibg=#00ff00 set foldenable set foldmethod=manual set foldcolumn=0 setlocal foldlevel=3 set foldclose=all nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR> set expandtab set tabstop=4 set shiftwidth=4 set softtabstop=4 set smarttab set ai set si set wrap set sw=4 set wildmenu set ruler set cmdheight=1 set lz set backspace=eol,start,indent set whichwrap+=<,>,h,l set magic set noerrorbells set novisualbell set showmatch set mat=4 set hlsearch set ignorecase set encoding=utf-8 set fileencodings=utf-8 set termencoding=utf-8 set smartindent set cin set showmatch set guioptions-=T set guioptions-=m set vb t_vb= set laststatus=4 set pastetoggle=<F9> set background=dark set t_ti= t_te= highlight Search ctermbg=black ctermfg=white guifg=white guibg=black autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()" func SetTitle() if expand("%:e") == 'sh' call setline(1, "#!/bin/bash")call setline(2, "##############################################################") call setline(3, "# File Name: ".expand("%"))call setline(4, "# Version: V1.0")call setline(5, "# Author: daveorff")call setline(6, "# Organization:")call setline(7, "# Created Time : ".strftime("%F %T"))call setline(8, "# Description:")call setline(9, "##############################################################")endif endfuncshell腳本調(diào)試之sh命令
shell命令解釋器
參數(shù): -c string 命令從-c后的字符串讀取 -i 實現(xiàn)腳本交互 -n 進(jìn)行shell腳本的語法檢查 -x 實現(xiàn)shell腳本的逐條語句的跟蹤應(yīng)用 sh -n filename.sh 僅調(diào)試 sh -vx filename.sh 以調(diào)試的方式執(zhí)行,查詢整個執(zhí)行過程 使用-x參數(shù)跟蹤腳本調(diào)試shell腳本,能打印除所執(zhí)行的每一行命令以及當(dāng)前狀態(tài)if結(jié)構(gòu)條件語句知識與實踐
簡單理解:如果…那么…否則…
單分支
if <條件表達(dá)式> then指令 fi雙分支
if <條件表達(dá)式> then指令 else指令2 fi多分支
if條件多分枝結(jié)構(gòu)主體為 "如果...,那么...,否則如果,那么,否則如果...那么...,...,否則..."if <條件表達(dá)式1> then指令1 elif <條件表達(dá)式2> then指令2 elif <條件表達(dá)式3> then指令3 else指令4 fi嵌套if
if <條件表達(dá)式1> then指令1 else指令2if <條件表達(dá)式2>then指令3fi fi 邏輯不清晰,不推薦使用,可以使用多個if分支。實踐
例1:如果不存在/backop目錄就創(chuàng)建,存在則打印exist [root@m01 scripts]# vim 01_01.sh #!/bin/bash path="/backup" if [[ -d $path ]] thenecho "eixst" elsemkdir $path -p fi執(zhí)行 [root@m01 scripts]# sh 01_01.sh [root@m01 scripts]# sh 01_01.sh eixst案例2:開發(fā)shell腳本判斷系統(tǒng)剩余內(nèi)存的大小,如果低于100MB就提示內(nèi)存不足,否則提示內(nèi)存充足 分析:先取內(nèi)存 [root@m01 ~]# free -mtotal used free shared buff/cache available Mem: 3773 124 3488 11 160 3429 Swap: 1999 0 1999 字段結(jié)束: total 內(nèi)存總數(shù) used 已經(jīng)使用的內(nèi)數(shù) free 空閑的內(nèi)存數(shù) shared 是指共享的 buffes 是指緩沖內(nèi)存數(shù) cached 是指緩存內(nèi)存數(shù),單位是kb 關(guān)系:total=used+free使用awk取值 [root@m01 ~]# free -m | awk 'NR==2{print $4}' 3475再寫if語句 [root@m01 scripts]# vim 02.sh #!/bin/bash mem=`free -m | awk 'NR==2{print $4}'` if [[ $mem -le 100 ]] thenecho "內(nèi)存不足" elseecho "內(nèi)存充足" fi#測試 [root@m01 scripts]# sh 02.sh 內(nèi)存充足 [root@m01 scripts]# sh 02.sh 內(nèi)存充足#改到4000測試 [root@m01 scripts]# sh 02.sh 內(nèi)存不足案例3: 分別使用變量定義,read讀入及腳本傳參方式實現(xiàn)比較兩個整數(shù)的大小 1.read讀入方式: 解析:可以在傳入的時候設(shè)置3個參數(shù),以達(dá)到判斷是否多出兩個整數(shù)的目的 先使用rend讀入兩個整數(shù) read -p "請讀入兩個整數(shù):" a b c 判斷輸入整數(shù)個數(shù)是否小于2 方法:判斷b是否為空 只有不為空繼續(xù)下一步,否則退出 判斷輸入整數(shù)個數(shù)是否大于2,判斷c是否為空,只有為空才進(jìn)行下一步,否則退出 如果是再判斷是否是兩個整數(shù) :如果兩個數(shù)都是整數(shù)則進(jìn)行下一步,否則退出 expr $a + $b + 3 &>/dev/null 如果都滿足則比較大小 [root@m01 scripts]# cat 03_01.sh #!/bin/bash read -p "請輸入兩個整數(shù):" a b c if [[ -z $b ]] thenecho "缺失一個數(shù),請輸入兩個整數(shù)"exit 1 fiif [[ -n $c ]] thenecho "參數(shù)個數(shù)大于2,請輸入兩個整數(shù)"exit 2 fiexpr $a + $b + 1 &>/dev/null if [[ $? -ne 0 ]] thenecho "只能比較整數(shù)"exit 3 fiif [[ $a -lt $b ]] thenecho "$a < $b" elif [[ $a -gt $b ]] thenecho "$a > $b" elseecho "$a = $b" fi使用傳參的方式: [root@m01 scripts]# cat 03_02.sh #!/bin/bash a=$1 b=$2 if [[ $# -ne 2 ]] thenecho "參數(shù)個數(shù)不對,請輸入兩個整數(shù)"exit 1 fiexpr $a + $b + 3 &>/dev/null if [[ $? -ne 0 ]] thenecho "只能比較整數(shù)"exit 2 fiif [[ $a -lt $b ]] thenecho "$a < $b" elif [[ $a -gt $b ]] thenecho "$a > $b" elseecho "$a = $b" fi案例4: 打印一個菜單如下,當(dāng)用戶選擇對應(yīng)的數(shù)字時,就執(zhí)行對應(yīng)項目的應(yīng)用 1.install lamp 2.install lnmp 3.exit[root@m01 scripts]# cat 04.sh #!/bin/bash cat<<EOF 1.install lamp 2.install lnmp 3.exit EOF read -p "請選擇序號1|2|3:" num expr $num + 2 &>/dev/null if [[ $? -ne 0 ]] thenecho "error1:請輸入整數(shù)"exit fiif [[ $num -eq 1 ]] thenecho "install lamp..." elif [[ $num -eq 2 ]] thenecho "instahll lnmp..." elif [[ $num -eq 3 ]] thenecho "exit"exit elseecho "請選擇序號1~3" fi嵌套if寫法: [root@m01 scripts]# cat 04_01.sh #!/bin/bash cat<<EOF 1.install lamp 2.install lnmp 3.exit EOF read -p "請選擇序號1|2|3:" num expr $num + 2 &>/dev/null if [[ $? -ne 0 ]] thenecho "error1:請輸入整數(shù)"exit elseif [[ $num -eq 1 ]]thenecho "install lamp..."elif [[ $num -eq 2 ]]thenecho "instahll lnmp..."elif [[ $num -eq 3 ]]thenecho "exit"exitelseecho "請選擇序號1~3"fi fishell函數(shù)的概念與作用及語法介紹
函數(shù)的概念與作用
簡單來說,函數(shù)的作用就是將程序多次被調(diào)用的相同代碼組合成函數(shù)體,并且為其取名,即函數(shù)名。當(dāng)其他所有重復(fù)調(diào)用這部分代碼的地方只需要用這個名字即可,當(dāng)需要修改這部分重復(fù)代碼時,也只需要改變函數(shù)體內(nèi)的一部分代碼即可實現(xiàn)所有調(diào)用的修改,也可以把函數(shù)單獨(dú)的寫入文件中,當(dāng)需要調(diào)用函數(shù)時,再加載來使用。
使用shell函數(shù)的優(yōu)勢
- 把相同的程序段定義成函數(shù),可以減少整個程序的代碼里,提升開發(fā)效率
- 增加函數(shù)的可讀性,易讀性,提升管理效率
- 可以實現(xiàn)程序功能模塊化,使得程序具備通用性,也就是可移植性
- 對應(yīng)shell來說,Linux系統(tǒng)里近2000個命令都可以說是shell函數(shù)
**函數(shù)的多種語法 **
第一種語法: function 函數(shù)名() {指令集...return n }第二種語法: function 函數(shù)名 {指令集return n }第三種語法:(推薦) 函數(shù)名() {指令集...return n }注意空格,return 函數(shù)返回值函數(shù)的執(zhí)行
不帶參數(shù)的函數(shù)執(zhí)行時,直接輸入函數(shù)名即可(注意不帶小括號)。(–簡單函數(shù)執(zhí)行)
案例: [root@m01 scripts]# vim func1.sh #!/bin/bash function test_1() {echo "i am function_t1" }function test_2 {echo "hello t2" }test_3() {echo "hei t3" } test_1 test_2 test_3 總結(jié):;定義完函數(shù)后,直接使用其名字即可調(diào)用。有關(guān)函數(shù)執(zhí)行的重要說明
--執(zhí)行shell函數(shù)時,函數(shù)名前的function和函數(shù)的小括號都不要帶 --函數(shù)的定必須在執(zhí)行前面定義或加載 --shell執(zhí)行系統(tǒng)中各種程序的順序為:系統(tǒng)別名-> 函數(shù)->系統(tǒng)命令->可執(zhí)行文件 --函數(shù)執(zhí)行時,會和調(diào)用它的腳本共用變量(相當(dāng)于腳本的參數(shù)與函數(shù)共用),也可以為函數(shù)設(shè)定局部變量以及特殊位置參數(shù) --在shell函數(shù)中,return命令功能與exit類似,作用是從函數(shù)中退出并返回函數(shù)值,而exit是退出腳本文件 --return語句會返回有關(guān)退出值(即返回值)給調(diào)用函數(shù)的當(dāng)前程序,而exit會返回有關(guān)退出值(即返回值)給執(zhí)行程序當(dāng)前shell --如果函數(shù)存放在單獨(dú)的文件中,被腳本加載使用時,需要source或 . 點來加載 --在函數(shù)內(nèi)一般使用local定義局部變量,這些變量離開函數(shù)即消失,不用local可以在腳本外調(diào)用。**帶參數(shù)的函數(shù)的執(zhí)行方法格式如下: ** (–函數(shù)傳參)
[root@m01 scripts]# cat func2.sh #!/bin/bash function test_1() {echo "i am $1" }function test_2 {echo "$2" }test_3() {echo "$3" } test_1 我是函數(shù)傳參1 test_2 4 5 6 test_3 7 8 9 [root@m01 scripts]# sh func2.sh i am 我是函數(shù)傳參1 5 9帶參數(shù)的函數(shù)執(zhí)行格式:
函數(shù) 參數(shù)1 參數(shù)2 ...函數(shù)后接的參數(shù)說明
shell位置參數(shù)($1,$2,$3,...$#,$*,$?以及$@等)都可以作為函數(shù)的參數(shù)使用 此時父腳本的參數(shù)臨時的被函數(shù)所掩蓋或隱蔽 $0比較頁數(shù),它仍然是父腳本的名稱 當(dāng)函數(shù)執(zhí)行完成時,原來的命令腳本參數(shù)即恢復(fù) 函數(shù)參數(shù)變量是函數(shù)體里面定義的#理解: #比如$?的使用;可以查看函數(shù)的執(zhí)行狀態(tài),狀態(tài)碼范圍是0-255,且$?取值是腳本的最后一條命令的狀態(tài)碼 [root@m01 scripts]# cat func3.sh #!/bin/bash function gg {echo "hello gg"return 110 } gg [root@m01 scripts]# sh func3.sh hello gg [root@m01 scripts]# echo $? 110#local的使用; [root@m01 scripts]# cat func4.sh #!/bin/bash function test_1 {local i="xiaoming"echo "i am $i" } test_1 echo $i [root@m01 scripts]# sh func4.sh i am xiaoming#從此輸出為空,在函數(shù)內(nèi)一般使用local定義局部變量,這些變量離開函數(shù)后即消失 [root@m01 scripts]# #總結(jié): #使用local后在函數(shù)之外是無法調(diào)用函數(shù)體內(nèi)的變量,把local去掉就是腳本變量是可以生效的。 #建議多個函數(shù)間定義同一個變量時使用local,這樣多個函數(shù)間的同名變量便不會發(fā)生沖突。將函數(shù)傳參轉(zhuǎn)為腳本傳參 (–腳本傳參)
[root@m01 scripts]# cat func6.sh #!/bin/bash daveff() {echo "i am $1" } daveff $1 [root@m01 scripts]# sh func6.sh superman i am superman將函數(shù)體和函數(shù)執(zhí)行分成不同的文件
1.將函數(shù)寫入系統(tǒng)函數(shù),/etc/init.d/functions 寫入此文件最后兩行上面 例: ...fi fifunction daveorff() {echo " I am $1" }2.使用點 . 或source調(diào)用,地址為 /etc/init.d/functions [root@m01 scripts]# cat func5.sh #!/bin/bash source /etc/init.d/functions daveorff $13.測試,腳本鏈接什么參數(shù),就輸出什么內(nèi)容 [root@m01 scripts]# sh func5.sh abcI am abc [root@m01 scripts]# sh func5.sh cbaI am cba查看shell /etc/init.d/functios文件中所有的函數(shù)名grep -E "[a-zA-Z]+\(\)" /etc/init.d/functions -o總結(jié):
函數(shù)總共有四種執(zhí)行方式
函數(shù)案例
案例: 1.通過腳本傳參的方式,檢查web網(wǎng)站URL是否正常 解析: wget命令 --spider 不下載任何大小;模擬爬蟲 -q 安靜訪問 --quiet 安靜模式(沒有輸出) -o 把記錄寫的file文件中,加/dev/null表示不輸出 -T 超時時間,設(shè)定響應(yīng)超時的秒數(shù) -t 重試,設(shè)定最大嘗試連接次數(shù)(0表示無限制) [root@m01 ~]# wget --spider -T 5 -q -o /dev/null -t 2 www.baidu.com [root@m01 ~]# echo $? 0curl 命令 -l 值顯示請求頭信息 -s 靜默模式,不輸出任何東西 -S 顯示錯誤 -o 把輸出寫到文件,加/dev/null表示不輸出 -w % {http_code} 返回狀態(tài)碼,200為正常 -m 設(shè)置最大傳輸時間[root@m01 ~]# curl www.baidu.com -s &>/dev/null [root@m01 ~]# echo $? 0 [root@m01 ~]# curl -l -m 5 -s -w "%{http_code}\n" -o /dev/bull www.baidu.com 200不用函數(shù)的的寫法 [root@m01 scripts]# cat checkurl.sh #!/bin/bash wget --spider -T 5 -q -o /dev/null -t 2 $1 if [[ $? -eq 0 ]] thenecho "$1 is ok" elseecho "$1 is fail" fi [root@m01 scripts]# sh checkurl.sh www.baidu.com www.baidu.com is ok [root@m01 scripts]# sh checkurl.sh www.baidu.co www.baidu.co is fail使用函數(shù)寫法 [root@m01 scripts]# cat checkurl_01.sh #!/bin/bash usage(){echo "Usage: $0 url"exit 1 }checkurl(){wget --spider -T 5 -q -o /dev/null -t 2 $1if [[ $? -eq 0 ]]thenecho "is ok"elseecho "is fail"fi }main(){if [[ $# -ne 1 ]]thenusageficheckurl $1 } main $* [root@m01 scripts]# sh checkurl_01.sh www.baidu.co is fail [root@m01 scripts]# sh checkurl_01.sh www.baidu.com is okcase結(jié)構(gòu)條件語句
case結(jié)構(gòu)條件語句相等于多分支的if/elif/else條件語句,但是它比這條件語句看起來更加規(guī)范工整,常被用于實現(xiàn)系統(tǒng)服務(wù)啟動腳本等。
case 語法: case "變量" in值1)指令1...;;值2)指令2...;;值3)指令3...;;*)指令4... esaccase條件語句的執(zhí)行流程邏輯圖
case條件語句的使用總結(jié)
1.case語句和if條件語句的適用性 case語句比較適合變量較少且為固定的數(shù)字或字符串集合的情況,而非不確定的的內(nèi)容,如范圍。如果便的值是已知固定的start/stop/restart等元素,那么采用case語句實現(xiàn)比較合適。2.case語句和if條件語句的常見應(yīng)用場景 - case主要寫服務(wù)的啟動腳本,一般情況下,傳參不同且具有少量的字符串,使用范圍較窄 - if就是取值判斷,比較,應(yīng)用比case更廣,幾乎所有的case語句都可以使用if條件語句實現(xiàn)3.case語句的特定及優(yōu)勢 case語句就相當(dāng)于多分支if/elif/else語句,單case語句的優(yōu)勢更規(guī)范,易讀。案例:
執(zhí)行shell腳本,打印一個如下的水果菜單 1.apple 2.pear 3.banana 4.cherry 當(dāng)用戶輸入對應(yīng)的數(shù)字選擇水果是,告訴他選擇的水果是什么,并給水果單詞加上一種顏色,使用case語句實現(xiàn)。[root@m01 scripts]# cat 06.sh #!/bin/bash cat << EOF 1.apple 2.pear 3.banana 4.cherry EOFread -p "請選擇序號:" num case "$num" in1)echo -e "\033[31m apple \033[0m";;2)echo -e "\033[32m pear \033[0m" ;;3)echo -e "\033[33m banana \033[0m";;4)echo -e "\033[34m cherry \033[0m";;*)echo -e "\033[36m 請選擇1~4 \033[0m"exit esac顏色代碼
腳本中echo顯示內(nèi)容帶顏色顯示,echo顯示帶顏色,需要使用參數(shù)-e格式如下: echo -e “\033[字背景顏色;文字顏色m字符串\033[0m”例如: echo -e “\033[41;36m good \033[0m” 其中41的位置代表底色, 36的位置是代表字的顏色 1、字背景顏色和文字顏色之間是英文的冒號 ";" 2、文字顏色后面有個m 3、字符串前后可以沒有空格,如果有的話,輸出也是同樣有空格內(nèi)容的顏色用數(shù)字表示,范圍為30-37,每個數(shù)字代表一種顏色。代碼如下: echo -e "\033[30m 黑色字 \033[0m" #<==30m表示黑色字。 echo -e "\033[31m 紅色字 \033[0m" #<==31m表示紅色字。 echo -e "\033[32m 綠色字 \033[0m" #<==32m表示綠色字。 echo -e "\033[33m 棕色字 \033[0m" #<==33m表示棕色字(brown),和黃色字相近。 echo -e "\033[34m 藍(lán)色字 \033[0m" #<==34m表示藍(lán)色字。 echo -e "\033[35m 洋紅字 \033[0m" #<==35m表示洋紅色字(magenta),和紫色字相近。 echo -e "\033[36m 藍(lán)綠色 \033[0m" #<==36m表示藍(lán)綠色字(cyan),和淺藍(lán)色字相近。 echo -e "\033[37m 白色字 \033[0m" #<==37m表示白色字。給輸出的字符串加不同的背景顏色: 字的背景顏色對應(yīng)的數(shù)字范圍為40-47,代碼如下。 echo -e "\033[40;37m 黑底白字\033[0m" #<==40m表示黑色背景。 echo -e "\033[41;37m 紅底白\033[0m" #<==41m表示紅色背景。 echo -e "\033[42;37m 綠底白字\033[0m" #<==42m表示綠色背景。 echo -e "\033[43;37m 棕底白字\033[0m" #<==43m表示棕色背景(brown),和黃色背景相近。 echo -e "\033[44;37m 藍(lán)底白字\033[0m" #<==44m表示藍(lán)色背景。 echo -e "\033[45;37m 洋紅底白字\033[0m" #<==45m表示洋紅色背景(magenta),和紫色背景相近。 echo -e "\033[46;37m 藍(lán)綠底白字\033[0m" #<==46m表示藍(lán)綠色背景(cyan),和淺藍(lán)色背景相近。 echo -e "\033[47;30m 白底黑字\033[0m" #<==47m表示白色背景。最后面控制選項說明 \033[0m 關(guān)閉所有屬性 \033[1m 設(shè)置高亮度 \033[4m 下劃線 \033[5m 閃爍 \033[7m 反顯 \033[8m 消隱 \033[30m — \33[37m 設(shè)置前景色 \033[40m — \33[47m 設(shè)置背景色 \033[nA 光標(biāo)上移n行 \033[nB 光標(biāo)下移n行 \033[nC 光標(biāo)右移n行 \033[nD 光標(biāo)左移n行 \033[y;xH設(shè)置光標(biāo)位置 \033[2J 清屏 \033[K 清除從光標(biāo)到行尾的內(nèi)容 \33[s 保存光標(biāo)位置 \033[u 恢復(fù)光標(biāo)位置 \033[?25l 隱藏光標(biāo) \033[?25h 顯示光標(biāo) ;; 3)echo -e "\033[33m banana \033[0m";; 4)echo -e "\033[34m cherry \033[0m";; *)echo -e "\033[36m 請選擇1~4 \033[0m"exitesac
### 顏色代碼腳本中echo顯示內(nèi)容帶顏色顯示,echo顯示帶顏色,需要使用參數(shù)-e
格式如下:
echo -e “\033[字背景顏色;文字顏色m字符串\033[0m”
例如:
echo -e “\033[41;36m good \033[0m”
其中41的位置代表底色, 36的位置是代表字的顏色
1、字背景顏色和文字顏色之間是英文的冒號 “;”
2、文字顏色后面有個m
3、字符串前后可以沒有空格,如果有的話,輸出也是同樣有空格
內(nèi)容的顏色用數(shù)字表示,范圍為30-37,每個數(shù)字代表一種顏色。代碼如下:
echo -e “\033[30m 黑色字 \033[0m” #<==30m表示黑色字。
echo -e “\033[31m 紅色字 \033[0m” #<==31m表示紅色字。
echo -e “\033[32m 綠色字 \033[0m” #<==32m表示綠色字。
echo -e “\033[33m 棕色字 \033[0m” #<==33m表示棕色字(brown),和黃色字相近。
echo -e “\033[34m 藍(lán)色字 \033[0m” #<==34m表示藍(lán)色字。
echo -e “\033[35m 洋紅字 \033[0m” #<==35m表示洋紅色字(magenta),和紫色字相近。
echo -e “\033[36m 藍(lán)綠色 \033[0m” #<==36m表示藍(lán)綠色字(cyan),和淺藍(lán)色字相近。
echo -e “\033[37m 白色字 \033[0m” #<==37m表示白色字。
給輸出的字符串加不同的背景顏色:
字的背景顏色對應(yīng)的數(shù)字范圍為40-47,代碼如下。
echo -e “\033[40;37m 黑底白字\033[0m” #<==40m表示黑色背景。
echo -e “\033[41;37m 紅底白\033[0m” #<==41m表示紅色背景。
echo -e “\033[42;37m 綠底白字\033[0m” #<==42m表示綠色背景。
echo -e “\033[43;37m 棕底白字\033[0m” #<==43m表示棕色背景(brown),和黃色背景相近。
echo -e “\033[44;37m 藍(lán)底白字\033[0m” #<==44m表示藍(lán)色背景。
echo -e “\033[45;37m 洋紅底白字\033[0m” #<==45m表示洋紅色背景(magenta),和紫色背景相近。
echo -e “\033[46;37m 藍(lán)綠底白字\033[0m” #<==46m表示藍(lán)綠色背景(cyan),和淺藍(lán)色背景相近。
echo -e “\033[47;30m 白底黑字\033[0m” #<==47m表示白色背景。
最后面控制選項說明
\033[0m 關(guān)閉所有屬性
\033[1m 設(shè)置高亮度
\033[4m 下劃線
\033[5m 閃爍
\033[7m 反顯
\033[8m 消隱
\033[30m — \33[37m
設(shè)置前景色
\033[40m — \33[47m 設(shè)置背景色
\033[nA 光標(biāo)上移n行
\033[nB 光標(biāo)下移n行
\033[nC 光標(biāo)右移n行
\033[nD 光標(biāo)左移n行
\033[y;xH設(shè)置光標(biāo)位置
\033[2J 清屏
\033[K 清除從光標(biāo)到行尾的內(nèi)容
\33[s 保存光標(biāo)位置
\033[u 恢復(fù)光標(biāo)位置
\033[?25l 隱藏光標(biāo)
\033[?25h 顯示光標(biāo)
總結(jié)
以上是生活随笔為你收集整理的shell编程快速入门(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 万字干货 | 用游戏高手的用户洞察法,如
- 下一篇: 6.2自旋锁