Bash內(nèi)置基本變量
-
PWD
: 顯示當(dāng)前的工作目錄 -
OLDPWD
: 顯示上一次的工作目錄 -
~
:用戶家目錄 -
-
: 使用cd -
命令可以在上一次工作目錄和當(dāng)前工作目錄中來回切換 -
HISTSIZE
: 顯示shell中歷史命令保留數(shù)量 -
HISTFILE
: 顯示歷史命令文件存放路徑 -
HISTFILESIZE
: 顯示歷史命令文件存放命令數(shù)量 -
HISTCONTROL
: 顯示歷史命令記錄方式-
ignoredups
: 讓歷史命令保存方式為『不記錄連續(xù)重復(fù)命令』 -
ignorespace
: 讓歷史命令保存方式為「不記錄以空格開頭的命令」 -
ignoreboth
: 以上兩個皆有
-
-
!#
: 代表執(zhí)行歷史記錄中#號命令 -
!!
: 執(zhí)行上一次歷史命令 -
Esc,.
: 提取上一次命令最后一個參數(shù) -
!$
: 提取上一次命令最后一個參數(shù) -
PATH
: 環(huán)境變量 -
$?
: 上一次命令的執(zhí)行狀態(tài)結(jié)果 -
SHELL
: 當(dāng)前shell -
home
: 家目錄路徑 -
UID
: 用戶的UID -
GID
: 用戶的GID -
USER
: 用戶名
bash特性之命令行展開
-
~
: 自動展開為用戶家目錄 -
{}
:中間以多個" , "號為分隔茎活,依次展開為多個數(shù)量
bash特性之執(zhí)行狀態(tài)結(jié)果
-
成功
==0
-
失敗
==1-255
bash特性之命令結(jié)果引用
- `COMMAND`
$(COMMAND)
bash特性之引用
-
轉(zhuǎn)義
:用反斜杠在需要轉(zhuǎn)義的字符前,表示這個字符需要看作一個普通字符 -
強(qiáng)引用
:使用” ` “把所有內(nèi)容都引起來,``號中的所有內(nèi)容都看作為普通字符骏全,除了引號自身渣触,所以不要在``號內(nèi)再加``號 -
弱引用
:使用” “把內(nèi)容都引起來孟害,除了引號自身,把大部分字符都看作普通字符祖今,例外的有 ,$ , ` 妆距,三個特殊字符
bash特性之元字符
-
*
: 任意長度的任意字符 -
?
: 單個字符 -
[]
: 指定范圍內(nèi)的任意字符 -
[^]
: 指定范圍外的任意字符- 特殊格式
-
[a-z]
:任意字母(glob中不分大小寫) -
[0-9]
:任意一個數(shù)字 -
[a-z0-9]
:任意一個數(shù)字和字母 -
[:alpha:]
:大寫及字母 -
[:upper:]
:大寫字母 -
[:lower:]
:小寫字母 -
[:digit:]
:數(shù)字 -
[:alnum:]
:數(shù)字和字母 -
[:space:]
:空白(包含空格和制表格) -
[:punct:]
:標(biāo)點符號
-
- 特殊格式
bash特性之hash
緩存之前命令查找的結(jié)果穷遂,就叫命令hash,也叫命令緩存,可以使用hash
命令查看其緩存的命令的完事路徑及命中的次數(shù)娱据。
-
hash
options:
-d [COMMAND] :清除指定的緩存命令 -r : 清空hash表
===============
shell編程基礎(chǔ)
shell編程之變量
什么是變量蚪黑?
內(nèi)存空間地址+數(shù)據(jù),數(shù)據(jù)是放在內(nèi)存中吸耿,即也叫有名稱的內(nèi)存地址
變量的值的類型祠锣,決定了存儲格式、表示的數(shù)據(jù)范圍咽安、參與的運算
變量賦值
`name=VALUE`
bash對變量的機(jī)制
- 所有都看作字符型
- 不支持浮點數(shù)據(jù)伴网,需借用外部機(jī)制
- 變量無需事先申明,相當(dāng)于妆棒,賦值和申明同時實現(xiàn)
程序中變量引用的機(jī)制
把變量名出現(xiàn)的位置澡腾,直接替換為其所指向的內(nèi)存空間中的數(shù)據(jù)
變量的命名規(guī)范
- 不能以數(shù)字開頭,只能包含數(shù)字糕珊、字母动分、下劃線
- 變量名要做到見名知義
- 不能使用程序語言的保留字(if else where等)
變量的引用
- ${var_name}
- $var_name
變量的類型
-
本地變量
:作用范圍僅為當(dāng)前shell; -
環(huán)境變量
:作用范圍當(dāng)前進(jìn)程和其子進(jìn)程 -
局部變量
:作用范圍為某片代碼片; -
特殊變量
:shell內(nèi)置的红选,有特殊功用-
0
= 成功 -
1-255
= 失敗
-
各變量的賦值澜公、引用 、查看喇肋、刪除
本地變量
- 變量的定義
var_name=VALUE
- 變量的引用
${var_name} ,$name
- 變量的查看
set
- 變量的撤消
unset var_name (此次不需要加$)
環(huán)境變量
-
變量的定義
export var_name=value
var_name=value --> export var_name
-
declare -x var_name=VALUE
(-x 表示定義為一個環(huán)境變量)-
declare -i var_name=VALUE
(直接將var_name定義為整形)
-
-
變量的引用
-
${var_name}
$var_name
-
-
變量的查看
export
declare -x
printenv
env
-
變量的撤消
unset var_name
只讀變量的定義
-
declare -r var_name=VALUE
(只讀變量只有進(jìn)程結(jié)果后才會消息坟乾,如果定義在環(huán)境配置文件中,需要手動清除) readonly name
增強(qiáng)型變量賦值
i=1
i=$[$i+1]
let i+=1
let i+=2
變量做某種運算后存至變量中
-
let i=$i+# 等同 let i+=#
- +=, -=, *=, /=, %= 都需要使用
let
命令進(jìn)行描述
- +=, -=, *=, /=, %= 都需要使用
- 變量的自增
var=$[$var+1] == let var+=1 == let var++ - 變量的自減
var=$[$var-1] == let var-=1 == let var--
=============
bash之切片
基于字符串切片
Usage: ${var:offset: length}
例:
[root@localhost ~]#mypath="/etc/sysconfig/network-scripts/" #定義一個變量蝶防,等會切這個變量
[root@localhost ~]# echo ${mypath:5} #偏移5個字符顯示
sysconfig/network-scripts/
[root@localhost ~]# echo ${mypath:10} #偏移10個字符顯示
nfig/network-scripts/
[root@localhost ~]# echo ${mypath:5:5} #偏移5個字符甚侣,取5個字符
sysco
取出字符串的最后幾個字符:${var: -length}
注意:-length之前有空白字符;
[root@localhost ~]# echo ${mypath: -10}
k-scripts/
基于模式取子串
-
Usage:
-
${var#*word}
:自左而右间学,查找var變量中存儲的字符串中第一次
出現(xiàn)的由word所指明的字符殷费,刪除
此字符及其左側(cè)的所有內(nèi)容
-
${var##*word}
:自左而右印荔,查找var變量中存儲的字符串中最后一次
出現(xiàn)的由word所指明的字符,刪除
此字符及其左側(cè)的所有內(nèi)容
-
${var%word*}
:自右而左详羡,查找var變量中存儲的字符串中第一次
出現(xiàn)的由word所指明的字符仍律,刪除字符及其右側(cè)的所有內(nèi)容
-
${var%%word*}
:自右而左,查找var變量中存儲的字符串中最后一次
出現(xiàn)的由word所指明的字符实柠,刪除此字符及其右側(cè)的所有內(nèi)容
-
示例:
[root@localhost ~]#mypath="/etc/sysconfig/network-scripts"
[root@localhost ~]# echo ${mypath#*/}
etc/sysconfig/network-scripts
[root@localhost ~]#mypath="/etc/sysconfig/network-scripts"
[root@localhost ~]# echo ${mypath##*/}
network-scripts
[root@localhost ~]#mypath="/etc/sysconfig/network-scripts"
[root@localhost ~]# echo ${mypath%c*}
/etc/sysconfig/network-s
[root@localhost ~]# echo ${mypath%%c*}
/et
基于字串查找替換
-
Usage:
-
${var/pattern/replacement}
:查找var變量存儲的字符中第一次由pattern匹配到的內(nèi)容染苛,并替換為replacement -
${var//pattern/replacement}
:查找var變量存儲的字符中所有能夠由pattern匹配到的內(nèi)容,并替換為replacement -
${var/#pattern/replacement}
:查找var變量存儲的字符中最開始處能夠由pattern匹配到的內(nèi)容主到,并替換為replacement -
${var/%pattern/replacement}
: 查找var變量存儲的字符中最后位置能夠由pattern匹配到的內(nèi)容,并替換為replacement
-
示例:
[root@localhost ~]#url="http://www.baidu.com:80"
[root@localhost ~]# echo ${url/www/WWW}
http://WWW.baidu.com:80
[root@localhost ~]# echo ${url/w/W}
http://Www.baidu.com:80
[root@localhost ~]# echo ${url//w/W}
http://WWW.baidu.com:80
[root@localhost ~]# userinfo="root:x:0:0:rootuser:/root:/bin/bash"
[root@localhost ~]# echo ${userinfo/#root/ROOT}
ROOT:x:0:0:root user:/root:/bin/bash
[root@localhost ~]# userinfo="root:x:0:0:rootuser:/root:/bin/root"
[root@localhost ~]# echo ${userinfo/%root/ROOT}
root:x:0:0:root user:/root:/bin/ROOT
基于字串查找刪除
-
Usage:
-
${var/pattern}
:查找var變量存儲的字符中第一次由pattern匹配到的內(nèi)容躯概,并刪除登钥; -
${var//pattern}
:查找var變量存儲的字符中所有能夠由pattern匹配到的內(nèi)容,并刪除娶靡; -
${var/#pattern}
:查找var變量存儲的字符中最開始處能夠由pattern匹配到的內(nèi)容牧牢,并刪除; -
${var/%pattern}
:查找var變量存儲的字符中最后位置能夠由pattern匹配到的內(nèi)容姿锭,并刪除塔鳍;
-
示例:
[root@localhost ~]# userinfo="root:x:0:0:rootuser:/root:/bin/root"
[root@localhost ~]# echo ${userinfo/root}
:x:0:0:root user:/root:/bin/root
[root@localhost ~]# echo ${userinfo//root}
:x:0:0: user:/:/bin/
[root@localhost ~]# echo ${userinfo/#root}
:x:0:0:root user:/root:/bin/root
[root@localhost ~]# echo ${userinfo/%root}
root:x:0:0:root user:/root:/bin/
基于字符串大小寫轉(zhuǎn)換
-
Usage:
-
${var^^}
:把var變量中的所有小寫字母,統(tǒng)統(tǒng)替換為大寫呻此; -
${var,,}
:把var變量中的所有大寫字母轮纫,統(tǒng)統(tǒng)替換為小寫;
-
示例
[root@localhost ~]# echo $userinfo
root:x:0:0:root user:/root:/bin/root
[root@localhost ~]# myinfo=${userinfo^^}
[root@localhost ~]# echo $myinfo
ROOT:X:0:0:ROOT USER:/ROOT:/BIN/ROOT
[root@localhost ~]# echo ${myinfo,,}
root:x:0:0:root user:/root:/bin/root
空變量判斷賦值
-
Usage:
-
${var:-word}
:如果變量var為空或未聲明焚鲜,則返回word所表示的字符串掌唾;否則,則返回var變量的值,臨時賦值
[root@localhost ~]# echo $name #這行的值為空 [root@localhost ~]# echo ${name:-tom} tom [root@localhost ~]# name=hello [root@localhost ~]# echo ${name:-tom} hello
-
${var:=word}
:如果變量var為空或未聲明忿磅,則返回word所表示的字符串糯彬,并且把word賦值為var變量;否則葱她,則返回var變量的值撩扒,直接等值
[root@localhost ~]# echo $name #這行的值為空 [root@localhost ~]# name=${name:-tom} [root@localhost ~]# echo $name tom [root@localhost ~]# name=${name:-jerry} [root@localhost ~]# echo $name tom
-
${var:?error}
:如果變量var為空或未聲明,則返回error為錯誤信息吨些;否則搓谆,則返回var變量的值;[root@localhost ~]# echo "User's name is${name:?wrong}" -bash: name: wrong [root@localhost ~]# name=tom [root@localhost ~]# echo "User's name is${name:?wrong}" User's name is tom
-
${var:+word}
:如果變量var為空或未聲明锤灿,忽略挽拔;否則,則返回word但校;[root@localhost ~]# unset name [root@localhost ~]# echo "User's name is${name:+wrong}" User's name is [root@localhost ~]# name=tom [root@localhost ~]# echo "User's name is${name:+wrong}" User's name is wrong
-
===============
bash多命令執(zhí)行
-
無邏輯關(guān)系的
COMMAND1;COMMAND2;COMMAND3...
-
有邏輯關(guān)系的
-
邏輯的運算結(jié)果狀態(tài):
-
真
(True 螃诅,1
) -
假
(False ,0
)
-
-
與運算(乘法)
- 1&&1=1
- 1&&0=0
- 0&&1=0
- 0&&0=0
- 只有兩個都為真,結(jié)果才為真,否則為假(遵守短路法則)
-
或運算 :加法
- 1 || 0 = 1
- 1 || 1 = 1
- 0 || 1 = 1
- 0 || 0 = 0
- 只要一個為真术裸,即為真倘是,(類似電路并鏈)
-
非:取反
- ! 1 = 0
- ! 0 = 1
-
異或:判斷是否不同
- 不同者為真,相同者為零假
-
短路法則:
#COMMAND1 && COMMAND2 :
COMMAND1為『假』袭艺,COMMAND2不會再執(zhí)行搀崭,
COMMAND1為『真』,COMMAND2必須執(zhí)行
#COMMAND1 || COMMAND2
COMMAND1為『真』猾编;COMMAND2不會執(zhí)行
COMMAND1為『假』瘤睹;COMMAND2必須執(zhí)行
例:# id $username || useradd $username
bash的配置文件
1、bash配置文件的分類
- profile類:為交互式shell提供配置文件
- 全局配置
/etc/profile
/etc/profile.d/*.sh
- 用戶個人
~/.bash_profile
- 全局配置
- bashrc類: 為非交互式用戶提供配置文件
- 全局配置
/etc/bashrc
- 用戶個人
~/.bashrc
- 全局配置
2答倡、profile轰传、bashrc類的功用
- profile類
- 定義用戶的全局變量
- 運行命令和腳本
- bashrc類
- 定義本地變量
- 定義別名
3、登錄式shell瘪撇、非登錄shell讀取配置文件的順序
- 登錄式shell讀取順序
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
- 非登錄式shell讀取順序
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
4获茬、讓定義的配置文件立即生效
source /PATH/TO/PROFILE
. /PATH/TO/PROFILE
注意: 需要定義全局的別名,需修改/etc/bashrc文件
bash之算術(shù)運算
-
let
命令let SUM=$num1+$num2
echo $SUM
-
算術(shù)運算表達(dá)式一:
echo $[ $num1 + $num2 ]
-
算術(shù)運算表達(dá)式二:
echo $(($num1 + $num2))
-
算術(shù)運算表達(dá)式三:
expr $num1 + $num2
-
bash的運算符
+ - * / ** %
注意:乘法符號在有些場景中使用需要加轉(zhuǎn)義符
Bash之條件測試:
判斷某需求是否滿足倔既,需要由測試機(jī)制來實現(xiàn)
1. 使用執(zhí)行命令恕曲,并利用命令狀態(tài)返回值來判斷
- 0:成功,
- 1-255:失敗
2. 測試表達(dá)式格式
- test expression
- [ expression ] :括號前后兩端必須有空格渤涌,否則為語法錯誤
- [[ expression ]] :括號前后兩端必須有空格佩谣,否則為語法錯誤, 多為測試字符串
bash的測試類型:
-
數(shù)據(jù)測試
-
數(shù)值比較
- -eq : 是否等;[ $nu1 -eq $num2 ]
- -ne : 是否不等于歼捏;
- -gt : 是否大于
- -ge : 大于等于
- -lt : 是否小于
- -le : 是否小于等于
- 注意:可以使用[],[[ ]],建立使用[]
-
字符串測試 : 1稿存、字符串要加引號引用 ;2瞳秽、做比較時使用雙中括號[[ ]]
- == :是否等于
- > : 是否大于瓣履,此處也要使用雙中括號
- < : 是否小于,此處也要使用雙中括號
- != :是否不等于
- =~ :左側(cè)的字符串是否能被右側(cè)的pattern所匹配练俐,匹配為一部分袖迎,不是精確匹配
- -z “STRING” : 判斷指定的字串是否為空,空則為真腺晾,不空則假
- -n “string” :判斷指定的字串是否不空燕锥,空則為假,不空則真
- 注意:字符串與變量比較時悯蝉,最好能在變量上加” ”引起來,在字符串比較的時候归形, 最好能使用雙中括號,建議使用[[ ]] 鼻由,做等值比較時暇榴,必須要在等號前后空格厚棵,如果引用是變量,也是需要加空格蔼紧,變量名可以不用引號引起來
-
-
文件測試
-
存在性測試:
- -a FILE
- -e FILE
- 文件的存在性測試婆硬,存在則為真,否則則為假
-
存在性及文件類型
- -b FILE : 是否存在奸例,并且為塊設(shè)備文件
- -c FILE : 是否存在彬犯,并且為字符設(shè)備文件
- -d FILE : 是否存在,并且為目錄文件
- -f FILE : 是否存在查吊, 并且為普通文件
- -h FILE 或者 -L FILE : 是否存在并且為符號連接文件
- -p FILE : 是否存在谐区, 且為命名管道文件
- -S FILE :是否存在,且為套接字文件
-
-
文件權(quán)限測試
- -r FILE : 是否存在逻卖,并且可讀卢佣,對當(dāng)前用戶可讀
- -w FILE : 是否存在, 并且可寫
- -x FILE : 是否存在箭阶, 并且可執(zhí)行
-
特殊權(quán)限測試
- -g FILE : 是否存在煎饼, 并且擁有SGID權(quán)限
- -u FILE : 是否存在嚎杨,并且擁有SUID權(quán)限
- -k FILE : 是否存在迷殿, 且擁有sticky權(quán)限
-
文件是否有內(nèi)容
- -s FILE :是否存在看尼,并且是否有內(nèi)容
-
時間戳測試
- -N FILE : 文件自從上一次讀取操作后晴楔,是否被修改過
-
從屬關(guān)系測試:
- -O FILE : 當(dāng)前用戶是否為文件的屬主
- -G FILE : 當(dāng)前用戶是否屬于文件的屬組
-
雙目測試(文件新舊對比)
- FILE1 -ef FILE2 : FILE1 與FILE2是否為指向同一個文件系統(tǒng)上的相同的inode的硬連接
- FILE1 -nt FILE2 : FILE1是否新于FILE2
- FILE1 -ot FILE2 : FILE1是否舊于FILE2
-
組合測試條件
-
邏輯運算:
-
第一種:
- COMMAND1 && COMMAND2
- COMMAND1 || COMMAND2
- !COMMAND
- 例:[ -O FILE ] && [ -r FILE] :是否可讀并且為屬主
-
第二種:
- [ expression1 -a expression2 ]
- [ expression1 -o expression2 ]
- ![ expression1 ]
- 例: [ -O FILE -a -x FILE ] : 是否是屬主并且有執(zhí)行權(quán)限
-
-
注意:-a -o 只能在[]
中使用载矿,如果需要在雙括號中使用邏輯換算漆羔,需要使用 && || 來代替
Bash腳本之狀態(tài)返回值:
- 默認(rèn)是腳本中執(zhí)行的最后一條命令的狀態(tài)返回值剿干。
- 自定義狀態(tài)退出狀態(tài)碼:
- exit [n] :n為自己指定的狀態(tài)碼婆芦;0表示成功怕磨,非零表示失敗
- 注意:shell進(jìn)程遇到exit時,即會中止消约,因此整個腳本執(zhí)行即為結(jié)束
- exit [n] :n為自己指定的狀態(tài)碼婆芦;0表示成功怕磨,非零表示失敗
bash編程之向腳本傳遞參數(shù)
-
位置參數(shù)變量
- 例:myscript.sh argu1 argu2
-
腳本中引用方式:
- $1,$2…….${10},${11},….
-
位置參數(shù)變量輪替
-
shift
: 把引用過的參數(shù)T掉肠鲫,在腳本中永遠(yuǎn)只使用$1引用下一個- 例: shift 2 : 踢兩個,這樣就可以在腳本中永遠(yuǎn)以$1和$2來引用后面的參數(shù)
-
bash編程之特殊變量
-
$0 :腳本文件路徑本身或粮; 取文件名:basename $0
-
$# : 腳本參數(shù)個數(shù)
-
$* : 所有參數(shù)导饲,每個參數(shù)當(dāng)作為一個字串,一般用于保存用戶的參數(shù)
-
$@: 所有參數(shù)氯材,所有參數(shù)當(dāng)作為一個字串渣锦,一般用于保存用戶的參數(shù)
bash編程之語句類型
-
順序執(zhí)行:逐條運行
-
選擇執(zhí)行:
- 兩個或者以上的分支:滿足條件時只會執(zhí)行其中一個滿足條件的分支
-
循環(huán)執(zhí)行:
- 某代碼片斷(循環(huán)體)要執(zhí)行0、1或多個來回
腳本之語法錯誤檢查
bash -n script.sh
bash -x script.sh
腳本之用戶交互的實現(xiàn)
-
read [option]...[name...]
-
-p PROMPT
: 直接提示輸入信息氢哮,保存至變量 -
-t TIMEOUT
: 超時設(shè)置袋毙,默認(rèn)秒為單位
-
1、 選擇執(zhí)行:
-
單分支的if語句
if 測試條件冗尤;then 代碼分支 fi
-
雙分支的if語句
if 測試條件;then 條件為真時執(zhí)行的分支 else 條件為假時執(zhí)行的分支 fi
-
多分支的if語句
if 測試條件听盖;then 條件為真時執(zhí)行 elif 條件為真時執(zhí)行 else 條件為假是執(zhí)行 fi
2胀溺、循環(huán)執(zhí)行
-
for循環(huán)語句
for VAR in LIST;do 循環(huán)體 done
進(jìn)入條件:只要列表有可用元素,即可進(jìn)入循環(huán)
退出條件:列表中的元素遍歷完成后媳溺,即退出循環(huán)
列表的生成方式:
- 直接給出
- 整數(shù)列表
- a:{start..end}
- b: $(seq 起始數(shù)值 [步長] 結(jié)束數(shù)值)
- 返回列表的命令
- glob
- 變量引用
-
while循環(huán)語句
while CONDITION1;do 循環(huán)體 循環(huán)控制變量修正表達(dá)式 done
條件進(jìn)入:CONDITION測試為真
條件退出:CONDITION測試為假
-
until循環(huán)語句
until CONDITION;do 循環(huán)體 循環(huán)控制變量修正表達(dá)式 done
條件進(jìn)入:CONDITION測試為假
條件退出:CONDITION測試為真
在循環(huán)中控制循環(huán)的方法
1月幌、continue
-
表示提前結(jié)束本輪循環(huán),而直接進(jìn)入下一輪循環(huán)的條件測試
while CONDITION1;do COMMNAD1 if CONDITION2;then continue fi COMMNAD N done
示例 : 求100以內(nèi)的所有偶數(shù)之和
#!/bin/bash
declare -i evensum=0
declare -i i=0
while [ $i -le 100 ];do
let i++
if [ $[$i%2] -eq 1];then
continue
fi
let evensum+=$i
done
2悬蔽、break
- 表示提前跳出循環(huán)
示例:100以內(nèi)所有奇數(shù)之和
#!/bin/bash
declare -i evensum=0
declare -i i=1
while true;do
let $oddsum+=$i
let i+=2
if [ $i -gt 100 ];then
break
fi
done
while的特殊用法之遍歷文件的行
while read VARIABLE;do
循環(huán)休
done < /path/form/somefile
for循環(huán)的特殊用法
for ((控制變量初始化扯躺;條件判斷表達(dá)式;控制變量的修正語句))蝎困;do
循環(huán)體
done
控制變量初始化:僅在循環(huán)代碼開始運行時录语,執(zhí)行一次
控制變量的修正語句:每輪循環(huán)結(jié)束會先進(jìn)行控制變量修正運算,而后再做判斷
case選擇執(zhí)行語法
case $variable in
pattern1)
分支1
禾乘;澎埠;
pattern2)
分支2
;始藕;
pattern3)
分支3
蒲稳;;
*)
分支N
esac
case支持glob網(wǎng)絡(luò)的通配符:
*
伍派?
[]
a|b :a或者b
shell函數(shù)
把一段獨立功能的代碼當(dāng)作一個整體江耀,并定義一個函數(shù)名字,命名的代碼段诉植,就稱之為一個函數(shù)祥国。定義的函數(shù)代碼段不會自動執(zhí)行,需在調(diào)用的時候執(zhí)行晾腔。調(diào)用函數(shù)就是批是代碼中給出指定的函數(shù)名即可舌稀。函數(shù)可出現(xiàn)在任何位置,在代碼執(zhí)行時灼擂,都會被自動替換為函數(shù)代碼壁查。其函數(shù)命名不應(yīng)該為命令名。其可在過程式編程中實現(xiàn)代碼重用
剔应。以此實現(xiàn)模塊化編程
和結(jié)構(gòu)化編程
.
- 語法一
function f_name {
...函數(shù)體...
} - 語法二
f_name () {
...函數(shù)體...
}
函數(shù)的生命周期
- 每次被調(diào)用時創(chuàng)建潮罪,返回時終止
函數(shù)的返回值
- 函數(shù)返回值:
- 函數(shù)的執(zhí)行結(jié)果返回值:
- (1) 使用echo或printf命令進(jìn)行輸出;
- (2) 函數(shù)體中調(diào)用的命令的執(zhí)行結(jié)果领斥;
- 函數(shù)的退出狀態(tài)碼:
- (1) 默認(rèn)取決于函數(shù)體中執(zhí)行的最后一條命令的退出狀態(tài)碼嫉到;
- (2) 自定義:return
- 函數(shù)的執(zhí)行結(jié)果返回值:
示例:給定一個用戶名,取得用戶的id號和默認(rèn)shell
#!/bin/bash
#
userinfo() {
if id "$username" &> /dev/null; then
grep "^$username\>" /etc/passwd | cut -d: -f3,7
else
echo "No such user."
fi
}
username=$1
userinfo
username=$2
userinfo
傳遞參數(shù)給函數(shù)
- 在函數(shù)體中當(dāng)中月洛,可以使用$1何恶,$2, ...引用傳遞給函數(shù)的參數(shù);還可以函數(shù)中使用$*或$@引用所有參數(shù)嚼黔,$#引用傳遞的參數(shù)的個數(shù)细层;
- 在調(diào)用函數(shù)時惜辑,在函數(shù)名后面以空白符分隔給定參數(shù)列表即可,例如疫赎,testfunc arg1 arg2 arg3 ..
示例:添加10個用戶盛撑,其添加用戶的功能使用函數(shù)實現(xiàn),用戶名做為參數(shù)傳遞給函數(shù)
#!/bin/bash
#
# 5: user exists
addusers() {
if id $1 &> /dev/null; then
return 5
else
useradd $1
retval=$?
return $retval
fi
}
for i in {1..10}; do
addusers ${1}${i}
retval=$?
if [ $retval -eq 0 ]; then
echo "Add user ${1}${i} finished."
elif [ $retval -eq 5 ]; then
echo "user ${1}${i} exists."
else
echo "Unkown Error."
fi
done
函數(shù)變量的作用域
- 局部變量
- 作用域是函數(shù)的生命周期捧搞,在函數(shù)結(jié)束時被自動銷毀抵卫,定義的方法如下:
- lacal VARIABLE=VALUE
- 作用域是函數(shù)的生命周期捧搞,在函數(shù)結(jié)束時被自動銷毀抵卫,定義的方法如下:
- 本地變量
- 作用域是運行腳本的shell進(jìn)程的生命周期,作用范圍為當(dāng)前shell腳本程序文件
-
示例
#!/bin/bash # name=tom f_name() { local name=jerry } f_name echo $name 注意:以上正常情況下會顯示name=tom,如果不使用local定義為本地函數(shù)變量胎撇, 那么應(yīng)該name=jerry.
注意:在函數(shù)中定義變量盡量使用local來定義變量
=========
bash之?dāng)?shù)組
什么是數(shù)組介粘?
存儲多個元素的連續(xù)的內(nèi)存空間,其數(shù)組只有一個名字晚树,其數(shù)組的索引號從0開始姻采。
定義一個數(shù)組
-
declare -a NAME
: 聲明一個索引數(shù)組 -
declare -A NAME
: 聲明一個關(guān)聯(lián)數(shù)組- 索引數(shù)組為索引號(下標(biāo))從0開始,關(guān)聯(lián)數(shù)組的索引號可以自定義爵憎,其bash4及以后版本支持關(guān)聯(lián)數(shù)組
數(shù)組中元素的賦值方式
- 1慨亲、一次只賦值一個元素
- NAME[0]=pig
- NAME[1]=dog
- 2、一次賦值全部元素
- NAME=("VAL1","VAL2","VAL3",...)
- 3宝鼓、只賦值特定元素
- NAME=([0]="val1" [3]="val3",....): 稀疏格式的數(shù)組定義
- 4巡雨、read -a array_name
- val1 val2 val3.....(直接在提示符中寫,寫后回車即可)
- 5席函、declare -A world
- world[us]="america"
- world[uk]="United kingdom" :這種方式即關(guān)聯(lián)數(shù)組,直接給定下標(biāo)名稱
數(shù)組中的元素引用
- echo ${name[0]}
- 引用時只給數(shù)組名冈涧,表示引用為下標(biāo)為0的元素
數(shù)組的長度引用 (即數(shù)組中元素的個數(shù) )
* ${#ARRAY_NAME[*]}
* ${#ARRAY_NAME[@]}
注意:${#ARRAY_NAME}茂附,表示引用第一個元素的字符串長度
引用數(shù)組中的所有元素
- ${array_name[*]}
- ${array_name[@]}
數(shù)組元素切片
- ${array_name[@]:offset:number}
- offset :要跳過元素的個數(shù)
- number :要取出元素的個數(shù),省略number時督弓,表示取偏移量之后的所有元素
向非稀疏數(shù)組中追加元素
- array_name[${array_name[*]}]=
刪除數(shù)組中的某元素
- unset array[index]
關(guān)聯(lián)數(shù)組的定義
- declare -A array_name
- array_name=([index_name1]="val1" [index_name2]="val2")
bash之信號捕捉
trap 命令
-
-l
: 列出所有信號 - man 7 signal : 查看所有信號的功用
- kill -l : 查看所有信號
向腳本傳遞信號示例
#!/bin/bash
#
trap 'echo "dou ni wan er."' INT
trap 'echo "quit";exit1' INT
注意:可以把捕捉信號定義在一個函數(shù)里营曼,在其它位置調(diào)用,腳本參考<腳本合集>
bash之顏色設(shè)置
- echo -e "\033[42;35;5mHello world\033[0m"
[左側(cè)]4表示后景色
[左側(cè)]3表示前景色
顏色分類:1,2,3,4,5,6,7
-
#m : 定義加粗 愚隧、閃爍等功能
多種控制符蒂阱,可組合使用,彼此間用分號隔開