標籤:設定檔 基礎知識 背景色 底線 紫紅色
今天給大家總結一下關於bash的顏色,設定檔,變數,數組和相關shell指令碼編程的基本概念;
一.bash的顏色顯示規則
吧是的顏色顯示,說白了就是Ascll碼對於顏色的調用設定,而在於顏色代碼當中,字串個功能實現如下:
\033:表示ctrl鍵;
[:控制字元和顏色代碼之間的佔空間字元;
0m:關閉顏色屬性;
1m:加粗顯示文本字元;
4m:為文本字元加底線標識;
5m:使文本字元閃爍;
7m:將背景色和前景色彩調換,白變黑,黑變白;
8m:隱藏字元,將文本字元的背景色和前景色彩設定為相同顏色,同為黑或同為白;
30m-39m設定文本字元的前景色彩,即字型顏色,38m和39m暫時沒有用到;
40m-49m:設定文本字元的背景色,即一個黑色字元的背景後是什麼顏色,48m和49m暫時沒有用到;
前景 背景 顏色
30m 40m 黑色
31m 41m 紅色
32m 42m 綠色
33m 43m 黃色
34m 44m 藍色
35m 45m 紫紅色
36m 46m 青藍色
37m 47m 白色
例
加粗顯示文本字元
[[email protected] wjq]# echo -e "\033[1mhello worl\033[0m"
hello worl
為文本字元加底線標識
[[email protected] wjq]# echo -e "\033[4mhello worl\033[0m"
hello worl
加粗和設定底線同時進行,利用“;”分隔;
[[email protected] wjq]# echo -e "\033[1;4mhello worl\033[0m"
hello worl
二.設定檔
一個完整的程式通常包含四類檔案:
二進位檔案:可執行檔;
標頭檔,庫檔案;
協助文檔;
設定檔;
所有在命令列進行命令的操作,只要沒有設計到檔案的修改都只是在當前生命週期有效,當關閉系統後,再開啟則無法使用;設定檔是實現資料永久顯示的基本方法,將資料的改動放入設定檔中,當系統重啟後還能重複調用,如修改alias別名放入設定檔bashrc的文字文件當中,bashrc就是一個設定檔;
設定檔分為私人設定檔與通用設定檔
通用設定檔:/etc/bashrc,/etc/profile
私人設定檔:~/.bashrc,~/.bash_profile
注意:一般情況下定義變數都是先做先用,並不需要改設定檔(聲明變數在設定檔中可能使系統出現漏洞)沒有必要就不要改;
設定檔又分為三類:
profile類:
為互動式登陸的shell進程實現功能初始化的設定檔;
bashrc類:
為非互動式登陸的shell進程實現功能啟動配置的設定檔;
logout類:
為互動式登陸的shell進程提供終止及清理類功能的設定檔;
互動式登入:
1.通過某個終端輸入帳號密碼來開啟的shell進程;
2.通過su - username開啟的shell進程;
非互動式登陸:
1.在圖形介面,通過右鍵菜單開啟終端的shell進程;
2.通過su username開啟的shell進程;
profile類:
/etc/profile
/etc/profile.d/*.sh
全域:在上述路徑中對設定檔進行修改,能對所有登陸的使用者進行改變;
往往在profile檔案中,如果一個設定檔中的內容過多,系統會把其切割成一個個片段,如profile.d,將切割出來的片段統
一的存放在”程式名稱.d“目錄,在該目錄下有關於片段的所有檔案大多以統一的檔案名稱尾碼來命名;
~/.bash_profile
局部:僅針對當前家目錄的使用者,對其進行改變,不影響其他使用者;
bashrc類:
/etc/bashrc
全域:可以定義對系統全部使用者有效命令別名,本地變數,以及遮罩碼umask;
~/.bashrc
局部:定義對於目前使用者有效命令別名,本地變數,以及遮罩碼umask;
三.變數應用
1.字串切片
${#var:}:返回變數var的字串長度;
${var:offset}:返回字串變數var的第offset個字元後面的字串;
${var:offset:number}:返回字串變數var的第offset個字元後面的number個字元;
例
[[email protected] wjq]# var="hello world"
[[email protected] wjq]# echo ${#var}
11
返回第六個字元後的字串
[[email protected] wjq]# echo ${var:6}
world
返回第六個字元後的兩個字串
[[email protected] wjq]# echo ${var:6:2}
wo
2.基於模式取字串:根據不同方式取符合pattern的字串
${var#*pattern}:在var字串變數中,從左至右搜尋第一個匹配字串pattern的字元,刪除從開始到第一個匹配到pattern的所有字元;
${var##*pattern}:在var字串變數中,從左至右搜尋最後一個匹配字串pattern的字元,刪除從開始到最後一個匹配到pattern的所有字元;
${var%pattern*}:在var字串變數中,從右至左搜尋第一個匹配到pattern的字元,刪除從開始到從右至左匹配的第一個pattern之間的所有字元;
${var%%pattern*}:在var字串變數中,從右至左搜尋最後一個匹配到pattern的字元,刪除從開始到從右至左最後一個匹配到的字元之間的所有字元;
例
①
[[email protected] wjq]# var=/etc/passwd
[[email protected] wjq]# echo ${var#*p}
asswd
②
[[email protected] ~]$ var=/etc/passwd
[[email protected] ~]$ echo "${var##*/}"
passwd
③
[[email protected] ~]$ var=/etc/passwd
[[email protected] ~]$ echo "${var%s*}"
/etc/pas
[[email protected] ~]$
④
[[email protected] ~]$ var=/etc/passwd
[[email protected] ~]$ echo "${var%%s*}"
/etc/pa
[[email protected] ~]$
3.尋找替換:利用不同方式,搜尋字串中匹配pattern的字元,並用substring字串對其進行替換;
${var/pattern/substring}:在var字串變數中,搜尋第一個匹配到pattern的字串,並用substring字串對其進行替換;
${var//pattern/substring}:在var字串變數中,搜尋所有匹配到字串pattern的字串,並用substring字串進行替換;
${var/#pattern/substring}:在var字串變數中,搜尋行首匹配到字串pattern的字串,並用substring字串進行替換;
${var/%pattern/substring}:在var字串變數中,搜尋行尾匹配到字串pattern的字串,並用substring字串進行替換;
例
①
[[email protected] ~]$ var=/etc/passwd
[[email protected] ~]$ echo "${var/e/wu}"
/wutc/passwd
②
[[email protected] ~]$ var=/etc/passwd
[[email protected] ~]$ echo "${var//s/wu}"
/etc/pawuwuwd
③
[[email protected] ~]$ var=/etc/passwd
[[email protected] ~]$ echo "${var/#\//wu}"
wuetc/passwd
④
[[email protected] ~]$ var=/etc/passwd
[[email protected] ~]$ echo "${var/%d/wu}"
/etc/passwwu
4.尋找刪除:利用不同方式,搜尋匹配到的字串並刪除;
${var/pattern}:在字串變數var中,將第一次匹配到pattern的字串刪除;
${var//pattern}:在字串變數var中,將全部匹配到pattern的字串刪除;
${var/#pattern}:在字串變數var中,將行首匹配到pattern的字串刪除;
${var/%pattern}:在字串變數var中,將行尾匹配到pattern的字串刪除;
例
①
[[email protected] ~]$ var=/etc/passwd
[[email protected] ~]$ echo "${var/p}"
/etc/asswd
②
[[email protected] ~]$ var=/etc/passwd
[[email protected] ~]$ echo "${var//s}"
/etc/pawd
③
[[email protected] ~]$ echo "${var/#\/}"
etc/passwd
④
[[email protected] ~]$ echo "${var/%wd}"
/etc/pass
5.字元的大小寫轉換:
${var^^}:將字串var變數中的所有小寫字母轉換成大寫字母;
${var,,}:將字串var變數中的所有大寫字母轉換成小寫字母;
例
①
[[email protected] ~]$ var=/etc/passwd
[[email protected] ~]$ echo "${var^^}"
/ETC/PASSWD
[[email protected] ~]$
6.變數賦值:
${var:-value}:如果變數var為空白或未被設定,那麼直接返回value值,否則返回變數var值;
${var:+value}:如果變數var不為空白,則返回value,為空白則返回var;
${var:=value}:如果變數var為空白或者未被設定,那麼直接返回value值,並且將value值賦值給變數var,否則返回var值;
例
①
[[email protected] ~]$ var=//
[[email protected] ~]$ echo "${var:-qq}"
//
[[email protected] ~]$ var=
[[email protected] ~]$ echo "${var:-qq}"
qq
②
[[email protected] ~]$ var=
[[email protected] ~]$ echo "${var:+qq}"
[[email protected] ~]$ var=a
[[email protected] ~]$ echo "${var:+qq}"
qq
7.變數的間接引用:
如果第一個變數的值恰好是第二個變數的變數名,從第一個變數引用第二個變數的值的方法,就稱為間接變數引用;
var1=var2
var2=value
bash提供了兩種格式的間接變數引用方式:
eval myvar=\$$var1==>\$var2
myvar=$(!var1)
四.數組
數組:相當於幾個變數的集合,存放著一個或多個記憶體空間;
在bash中只提供一維數組,並且沒有限定數組大小,利用下標存取數組中的元素,數組元素由下標0開始編號即數組的索引結點:0,1,2...,數組可以採用連續的索引結點進行賦值——稠密數組,也可以採用不連續的索引結點進行賦值——稀疏數組。
數組名[下標]=值
例如:
$a[0]=beijing
$a[1]=hainan
$a[2]=shanghai
數組的聲明:
1.數組可以採用上述聲明方式逐個賦值
2.直接對數組元素進行賦值:
$a=("beijing" "shanghai" "tianjin")或者$a=([0]="beijing" [1]="shanghai" [3]="tianjin")
3.利用declare命令建立數組:
$declare -a 數組名
引用數組元素:
1.$name或${name},兩者相同,若變數未定義則用空值替換;
2.引用固定的數組元素:${name[n]}引用索引結點為n的值;
3.引用整個數組的所有元素:${name[*]}或${name[@]}
例
[[email protected] ~]$ a[0]=beijing
[[email protected] ~]$ echo "${a[0]}"
beijing
[[email protected] ~]$ a=("wujunqi zhengzhong shaoning")
[[email protected] ~]$ echo "${a[0]} ${a[1]} ${a[2]}"
wujunqi zhengzhong shaoning
查看數組的長度:
可以通過${#name[*]}顯示出這個數組有多少個有意義的元素;
例
[[email protected] ~]$ a=(wujunqi zhengzhong shaoning)
[[email protected] ~]$ echo "${#a[*]}"
3
數組切片:
${name:offset}:顯示包括offset數字所表示的索引位置及以後的所有元素,去掉從第一個數組開始的offset個數組元素
${name:offset:number}:顯示包括offset數字所表示的索引位置及包括offset個元素的number個元素;
如${name:3:2}:丟棄0-2的陣列變數,只取3,4陣列變數;
撤銷數組:
unset array_name
刪除數組中的元素:
unset array_name[index]
RANDOM變數:可以產生一組在0-32767之間的隨機變數
例
[[email protected] ~]$ echo "$RANDOM"
16952
[[email protected] ~]$ echo "$RANDOM"
6653
五.bash指令碼編程
shell指令碼編程有三種:
過程式程式設計語言
指令碼類程式設計語言
解釋性語言
其中指令碼類程式設計語言在實現功能時是通過調用外部檔案來實現的;
過程式程式設計語言有三種結構,順序執行結構,選擇執行結構和迴圈分支結構;
1.順序執行結構:
根據使用者所寫的指令碼命令,從左至右,從上到下按順序執行;
2.選擇執行結構:
對於某特定語句,重複執行0次,一次或多次;如if,case語句;
if語句:
單分支語句:
if 測試條件
then 命令
fi
雙分支語句:
if 測試條件
then 命令1
else 命令2
fi
多分支語句:
if 測試條件
then 命令1
elif 測試條件
then 命令2
。。。
fi
例
計算100以內所有整數的和;
#!/bin/bash
#
read -t 5 -p "Please input a integer[0]: " INTEGER
if [ -z $INTEGER ] ; then
INTEGER=0
fi
if ! echo $INTEGER | grep -q "^\<[[:digit:]]\+\>$" ; then
echo "You must input an integer."
exit 5
fi
case語句:
可以進行多重條件選擇,相對於if,else的多分支語句,case語句的優勢就在於節約了系統所消耗的資源,其文法格式為:
case 變數引用 in
模式1)
分支1
;;
模式2)
分支2
;;
...
*)
預設分支
;;
esac
其執行過程是,利用變數引用所代表的值分別與各類模式進行比較,如果發現變數引用的值與某一類模式相同時,就執行該模式字串之後的各個命令,直到遇到兩個分號結束為止;
case語句的模式可以匹配數字,字串,萬用字元等模式;
注意:
①每個模式字串後面可有一條或多條命令,最後一條命令必須要由“;;”隔開
②模式字串可以使用萬用字元;
③如果一個模式字串包含多個模式,則應用“|”隔開;
④各模式字串應唯一;
⑤以關鍵字esac結束;
3.迴圈分支結構
將一段代碼重複的執行0次,1次或多次;一個好的迴圈結構必須要包括兩個最重要的環節,即進入迴圈的條件:開始迴圈時所滿足的條件;
退出迴圈的條件:
迴圈結束所滿足的條件;
shell中有三種用於迴圈的語句,即for,whie,until,select語句;
for語句:
for語句是最常用的迴圈結構語句。其使用方式主要有兩種,一種是值表方式,另一種是算術運算式方式;for迴圈特點,幾乎不會死迴圈,在執行迴圈的過程中,需要將這個LIST載入到記憶體當中;因此對於大列表來說可能會過多的消耗記憶體和cpu資源;
值表方式
其一般運算式為
for 變數 [in 值表];do 命令表;done
①值表可以是檔案Regex,其格式為:
for 變數 in 檔案Regex
do
命令表
done
其執行過程是,變數的值依次取目前的目錄下與Regex相匹配的檔案名稱,每取值一次,就進入迴圈體執行命令表,直至所有檔案名稱取完為止;
bash指令碼編程之使用者互動:
位置參數變數:$1,$2,$3,...
特殊變數:
$#:所有位置參數的總數;
$*:所有位置參數列表;當使用“”引用時,整個參數被當作一個字串;
[email protected]:所有位置參數列表;當使用“”引用時,每個參數作為單獨的字串存在;
$0:所執行指令檔自身的路徑;
②for迴圈指令碼也可以是全部的位置參數$#與$*
for 變數 in $*
do
命令
done
③
for迴圈指令碼可以直接使用純整數列表
{1..100}:表明從1-100,中間只能為兩點;
for i in {1..100}
do
命令
done
seq:輸出一個整數列表
seq [OPTION]... FIRST INCREMENT LAST
seq 10:從1-10
seq 5 10:從5-10
for i in $(seq 10)
do
命令
done
在這裡擴充一下關於read命令的功能
read 命令:從鍵盤上讀取資料,然後賦給指定變數;
read [-a 數組] [-p 提示符] [-t 逾時] []
利用read命令可互動的為變數賦值,輸入資料時,資料間以空格或定位字元作為分隔字元;
①
變數個數與給定資料個數相同,則依次賦值
$read x y z
$today is sunny
$echo $x $y $z
today is sunny
②
變數個數少於資料個數,則從左至右賦值,但最後一個變數被賦予剩餘的所有數;
③
變數個數多於資料個數,則依次對應賦值,而沒有資料與之對應的變數取空串;
例
在指令碼中-p選項給提示資訊,相當於echo
$read -p "please enter" name
-t選項5秒鐘內如果沒有進行輸入則返回,預設名字為link;
$read -t 5 -p "please enter[link]" name || [ -z $name] && name=link
算術運算式方式:
其一般格式為
for((運算式1; 運算式2; 運算式3 ))
do
命令表
done
運算式1:為變數賦初值;
運算式2:迴圈允出準則;
運算式3:變數值的變化規律;
如
for((T=1;I<=100;I++));do let "sum+=I";done;echo $sum
while語句:
格式:
①while 命令;do 命令;done
②while CONDITION;do
迴圈體
done
當CONDITION為真時,進入執行迴圈體中的語句,直至CONDITION為假時,跳出迴圈;
例當位置參數$1存在時執行while迴圈
while [ $1 ]
do
if [ -f $1 ]
then
echo "該檔案為普通文字檔"
else
echo "$1 is not a file"
fi
done
until語句:
格式:
①until 命令;do 命令;done
②until CONDITION;do
迴圈體
done
當CONDITION為假時,進入執行迴圈體中的語句,直至CONDITION為真時,跳出迴圈;
迴圈控制命令:
continue語句:
跳出當前迴圈語句,回到本層迴圈的開頭,進入下一輪條件判斷,若符合條件則進入下一輪迴圈;
若處在多層嵌套迴圈中,如:
for
while
for
continue [3]
跳出到最外層的迴圈,進行最外層迴圈的下一輪條件判斷,若符合則繼續迴圈;
例如:
for i in 1 2 3
do
if [ $i -eq 2 ]
then
continue
fi
echo "$i"
done
break語句:
break語句可以使指令碼從迴圈體中退出來,同continue相似,文法格式為:
break [n]
n預設值為1,即跳出一層迴圈;
若n=3時,表示連續跳出三層迴圈;
例如
for i in $*
do
if [ $i -eq 5 ]
then
break
else
echo "$i"
fi
done
當位置參數等於5時退出當前迴圈;
函數:
由某些功能封裝在一起,在需要的時候可以直接調用,將這種封裝起來的功能體稱作為函數;
函數與shell程式在形式上是一致的,但是,shell程式是可以直接執行的,但函數中的語句是要通過函數調用過後才能被執行;此外,函數中的命令是在當前shell的環境中運行,而shell程式中的命令是在子shell環境中運行;
函數應先定義之後才能被執行,可以像普通命令一樣直接使用,直接利用函數名,如show,不必帶圓括弧即可調用;shell指令碼與函數之間可以進行參數傳遞,函數中的$1,$2所對應的值是函數在調用時所帶的實參,還可以使用$*或[email protected]的方式引用所有位置參數;還可以使用$#計算為函數傳遞的參數個數;這一點與普通命令不同;函數的生命週期是從被調用開始直到遇到return結束命令或全部的命令語句執行完為止;
如
show arg1 arg2
arg1和arg2作為函數的實參;
函數定義格式:
文法一:
函數名()
{
命令表
}
文法二:
function 函數名()
{
命令表
}
使用set命令可以查看所有當前shell中生效的函數;
使用unset命令可以撤銷已經定義的函數;
調用函數之後函數的傳回值有兩種:
①函數結果的傳回值
如echo,print等輸出結果;
②函數狀態傳回值;
return [0];
函數的傳回值不能用exit命令,n為退出函數時的退出值,即$?的值,n值預設時,則退出值是最後一個命令執行後的傳回值;
Linux系統Bash(Shell)基礎知識(4)