bash的基礎(chǔ)特性之
globbing:文件名通配【一次操作多文件】
匹配模式:元字符
*:匹配任意長(zhǎng)度的任意字符【pa* 已pa開頭的任意文件 ls pa*瑰钮,但是在/目錄下ls好像顯示有問題】
?:匹配任意單個(gè)字符【如果是 pa?必須是pa后加上一個(gè)字符】
[]:匹配指定范圍內(nèi)的任意單個(gè)字符
[a-z],[a-z0-9]
[[:upper:]]匹配所有大寫字母
[[:lower:]]:匹配所有 小寫字母
[[:alpha:]]:匹配所有字母
[[:digit:]]:匹配所有數(shù)字
[[:alnum:]]:匹配所有字母和數(shù)字
[[:space:]]:匹配所有空白字符
[[:punct:]]:匹配所有標(biāo)點(diǎn)符號(hào)
[^]:匹配指定范圍外的任意單個(gè)字符
[^[:upper:]]
[^0-9]
[^[:alnum:]]
舉例:復(fù)制/home/myhome下所有以m開頭非數(shù)字結(jié)尾的文件夾到目標(biāo)地址:cp /home/myhome/m*[^0-9] /to/myPath
IO重定向及管理
程序:指令+數(shù)據(jù)
程序也有數(shù)據(jù)的IO
可用于輸入的設(shè)備:文件
鍵盤設(shè)備、文件系統(tǒng)上的常規(guī)文件畅涂、網(wǎng)卡等芭梯;
可用于輸出的設(shè)備:文件
顯示器皇钞、文件系統(tǒng)上的常規(guī)文件跨细、網(wǎng)卡燈砚偶。
程序的數(shù)據(jù)流有三種:
輸入的數(shù)據(jù)流:<--標(biāo)準(zhǔn)輸入(stdin),一般是鍵盤是越;
輸出的數(shù)據(jù)流:-->標(biāo)準(zhǔn)輸出(sdtout)耳舅,一般是顯示器;
錯(cuò)誤的輸出流: -->錯(cuò)誤輸出(stderr)倚评,一般也是顯示器浦徊。
fd:file descriptor 文件描述符
標(biāo)準(zhǔn)輸入:0
標(biāo)準(zhǔn)輸出:1
錯(cuò)誤輸出:2
特殊設(shè)備:/dev/null[這個(gè)還是不是很理解,但是看到老師有寫天梧,在創(chuàng)建用戶時(shí):
id user1 &> /dev/null || useradd user1
]
IO重定向:
輸出重定向:>
可以輸出到其他文件中盔性,例如cat ./m.txt > ./n/i.txt此時(shí)看./n/i.txt的文件就是之前./m.txt的內(nèi)容了,也可以輸出到其他終端上腿倚,例如cat ./m.txt > /dev/tty1此時(shí)登錄tty1就能夠看到這個(gè)消息
特性:覆蓋輸出
追加輸出重定向:>>保留原有文件內(nèi)容追加,例如cat m.txt >> n.txt 會(huì)把m和n的文件合并到n文件
set -C
禁止覆蓋輸出重定向文件
此時(shí)可以使用強(qiáng)制覆蓋輸出:>|
set +C
關(guān)閉上述特性
set -/+ C僅對(duì)當(dāng)前shell有效
錯(cuò)誤輸出重定向:2> ,2>>
這個(gè)是把命令執(zhí)行的錯(cuò)誤信息輸出敷燎,而不是正常數(shù)據(jù)的輸出
合并正常輸出流和錯(cuò)誤輸出流:
1暂筝、&>,&>>
2、command > /path/to/file 2>&1
command >> /path/to/file 2>&1
相應(yīng)的信息輸出到file硬贯,如果報(bào)錯(cuò)也追加輸入
錯(cuò)誤信息輸出至某個(gè)文件
輸入重定向:
<
tr命令:把輸入的數(shù)據(jù)當(dāng)中的字符焕襟,反思在SET1定義范圍內(nèi)出現(xiàn)的,對(duì)位轉(zhuǎn)換為SET2中字符饭豹,如果使用參數(shù)-d鸵赖,且SET2為空則將SET1中的字符進(jìn)行刪除顯示并不刪除源數(shù)據(jù)。
tr [a-z] [A-Z] < /path/to/file
會(huì)把file文件中的字符轉(zhuǎn)換為大寫顯示拄衰,但是源文件依然不變它褪。
<<:here documents
交互式:cat << EOF 結(jié)束后輸入EOF即會(huì)顯示交互的內(nèi)容
輸出至文件:cat > /path/to/file << EOF 結(jié)束后輸入EOF無(wú)反應(yīng),交互內(nèi)容保存至file中
管道
連接程序翘悉,實(shí)現(xiàn)將前一個(gè)命令的輸出直接重定向?yàn)楹笠粋€(gè)程序的輸入 COMMAND1 | COMMAND2 | COMMAND3
例如:cat m.txt | tr 'a-z' 'A-Z'則會(huì)將把m.txt文件中的小寫字母替換為大寫
who | head -2 查看前兩個(gè)用戶
tee命令 把數(shù)據(jù)流分為兩叉茫打,既干這個(gè)又干那個(gè)
例如:cat m.txt | tee /etc/m.tee | tr 'a-z' 'A-Z' 既會(huì)把m.txt的數(shù)據(jù)通過(guò)tr命令顯示小寫替換為大寫,還能把m.txt的數(shù)據(jù)復(fù)制給/etc/m.tee文件
bash基礎(chǔ)特性之自動(dòng)補(bǔ)充命令
命令補(bǔ)全:
shell程序接收到用戶執(zhí)行命令的請(qǐng)求妖混,分析完成后老赤,最左側(cè)的字符串會(huì)當(dāng)作命令。
命令的查找機(jī)制:
查找內(nèi)部命令制市;
根據(jù)PATH環(huán)境變量中設(shè)定的目錄抬旺,自作而又諸葛搜索目錄下的文件名。
如果給定的打頭字符串能夠唯一標(biāo)識(shí)某一命令程序文件祥楣,則自動(dòng)補(bǔ)全开财,如果不能唯一識(shí)別,再按一次tab荣堰,顯示出所有以此字符串打頭的列表床未。
路徑補(bǔ)全:
根據(jù)給定的起始路徑補(bǔ)全。
如果給定的打頭字符串能夠唯一標(biāo)識(shí)某一路徑文件振坚,則自動(dòng)補(bǔ)全薇搁,如果不能唯一識(shí)別,再按一次tab渡八,顯示出所有以此字符串打頭的列表啃洋。
bash的基礎(chǔ)特性之命令行展開
~:自動(dòng)展開為用戶的家目錄,或指定的用戶的家目錄屎鳍;
{}:可承載一個(gè)以逗號(hào)分隔的路徑列表宏娄,并能夠?qū)⑵湔归_為多個(gè)路徑。
例如/tmp/{a,b} 相當(dāng)于/tmp/a /tmp/b
mkdir {a,b}_{c,d} 會(huì) 創(chuàng)建a_c,a_d,b_c,b_d
bash基礎(chǔ)特性之命令執(zhí)行的狀態(tài)結(jié)果
命令執(zhí)行的狀態(tài)結(jié)果:
bash通過(guò)裝填返回值來(lái)輸出此結(jié)果:
成功:0逮壁;
失敺跫帷:1-255.
保存于環(huán)境變量$?中
命令執(zhí)行完成后,有的還會(huì)有命令返回值,根據(jù)命令及其功能不同卖宠,結(jié)果各不同巍杈。
引用命令的執(zhí)行結(jié)果:
$(command)或`command`
例如mkdir $(date %m-%d-%y)
bash基礎(chǔ)特性之快捷鍵
ctrl + a 跳轉(zhuǎn)至命令行行首
ctrl + e 跳轉(zhuǎn)至命令行行尾
ctrl + u 刪除行首至光標(biāo)所在之處之間的所有字符;
ctrl + k 刪除光標(biāo)所在處至行尾的所有字符
ctrl + l clear清屏
bash特性及bash腳本編程初步
系統(tǒng)構(gòu)成
終端:附著在終端的接口 程序:
GUI:KDE扛伍,GNome筷畦,Xfce
CLI:/etc/shells
bash的特性:
命令行展開:~,{}【這個(gè)知識(shí)點(diǎn)有點(diǎn)忘了,需要重新去溫習(xí)一下2020/03/22】
命令別名:alias刺洒,unalias
命令歷史:history
文件名通配:glob
快捷鍵:Ctrl +a鳖宾,e,u,k,l
命令補(bǔ)全:通過(guò)$PATH查找
路徑補(bǔ)全:通過(guò)打頭位置查找
命令hash:緩存此前運(yùn)行的命令的程序位置(key:value數(shù)據(jù)結(jié)構(gòu),key搜索鍵逆航,value值)
-d 刪除hash表中的某個(gè)命令歷史【使用場(chǎng)景鼎文,例如把cat程序從目錄A移動(dòng)到了目錄B,但是hash表中的緩存依然是目錄A纸泡,那么則會(huì)執(zhí)行出錯(cuò)漂问,此時(shí)刪除一下hash表中的cat命令即可,如果在hash表中沒有記錄女揭,則會(huì)去環(huán)境變量中查找此命令的實(shí)際位置】
-r 清空hash表所有的記錄
變量:指向內(nèi)存空間【修改數(shù)據(jù)只能在內(nèi)存中操作】
程序:指令+數(shù)據(jù)
指令:由程序文件提供蚤假;
數(shù)據(jù):通過(guò)IO設(shè)備獲取、通過(guò)文件獲取吧兔、通過(guò)管道磷仰、通過(guò)變量
程序也可稱為:算法+數(shù)據(jù)結(jié)構(gòu)
變量名:指向內(nèi)存中某一段空間的起始地址
變量賦值:name = value【shell中】
變量類型:決定了存儲(chǔ)格式、表示數(shù)據(jù)范圍境蔼、參與的運(yùn)算
編程語(yǔ)言:
強(qiáng)類型變量:c
弱類型變量:
bash把所有變量通通視為字符型灶平,做四則運(yùn)算時(shí)會(huì)自動(dòng)轉(zhuǎn)換為數(shù)值型;
bash中的變量無(wú)需事先聲明箍土,聲明和賦值過(guò)程同時(shí)實(shí)現(xiàn)逢享;聲明:類型、變量名吴藻;
變量替換:把變量名出現(xiàn)的位置替換為其所指向的內(nèi)存空間中的數(shù)據(jù)瞒爬;【有點(diǎn)不太理解】
變量引用:${var_name},$var_name,當(dāng)變量在一個(gè)字符串內(nèi)部沟堡,大括號(hào)不可省略侧但,例如"Hi ,${name}"
變量名:數(shù)字、字母航罗、下劃線禀横,不能以數(shù)字開頭;見名知義粥血,命名機(jī)制遵循某種法則柏锄,且不能使用程序的保留字酿箭,例如if,else趾娃,then七问,while等
bash的變量類型:
本地變量:作用域僅為當(dāng)前shell【不包括子進(jìn)程】
賦值:name = value
引用:${name},$name
""顯示變量名
''顯示變量值
查看變量:set命令
變量撤銷:unset name【此處非變量引用,不使用$】
環(huán)境變量:作用域?yàn)楫?dāng)前shell進(jìn)程及子進(jìn)程【例如在shell中運(yùn)行bash實(shí)際上進(jìn)入了子進(jìn)程shell茫舶,運(yùn)行exit退出shell子進(jìn)程,對(duì)父進(jìn)程無(wú)效】刹淌,退出之后則失效
變量賦值:
1饶氏、export name = value
2、name = value
export name
3有勾、declare -x name = value
4疹启、name = value
declare -x name
變量引用${name},$name
注意:bash內(nèi)嵌了許多環(huán)境變量(通常為全大寫字符),用于定義bash的工作環(huán)境蔼卡,例如:PATH喊崖,HISTFILE,HISTFILESIZE,HISTCONTROL,SHELL,HOME,UID,PWD<OLDPWD
查看環(huán)境變量的命令:export ,declare -x雇逞,printenv荤懂,env
撤銷環(huán)境變量:unset name
只讀變量:
declare -r name
readonly name
只讀變量無(wú)法重新賦值,且不支持撤銷塘砸,存活時(shí)間為當(dāng)前shell進(jìn)程的生命周期节仿,隨shell進(jìn)程終止而終止
局部變量:作用域僅為某代碼片段(函數(shù)上下文)
位置參數(shù)變量變量:當(dāng)執(zhí)行腳本的shell進(jìn)程傳遞的參數(shù);
特殊變量:shell內(nèi)置的特殊功用的變量掉蔬;
例如:$?【其中一個(gè)特殊變量】上一個(gè)命令執(zhí)行狀態(tài)的結(jié)果0表示成功廊宪,10255表示失敗。
多命令執(zhí)行:
command1女轿,command2箭启,command3,...執(zhí)行順序?yàn)?-2-3-...
邏輯運(yùn)算:
運(yùn)算數(shù):真(true,yes,on,1)
假(false,no,off,0)
與:&
或:||
非:蛉迹!
#異或:XOR
短路法則:
COMMAND1 && COMMAND2 命令1失敗命令2不執(zhí)行傅寡,命令1成功命令2執(zhí)行;
COMMAND1 ||COMMAND2 命令1失敗命令2執(zhí)行婿禽,命令1成功命令2不執(zhí)行赏僧;
示例:id $username || useradd $username(查看此用戶信息,如果不存在則進(jìn)行創(chuàng)建用戶)
shell腳本編程:
編程語(yǔ)言的分類:根據(jù)運(yùn)行方式
編譯運(yùn)行:源代碼 --> 編譯器(編譯)--> 程序文件扭倾;
C語(yǔ)言
解釋運(yùn)行:源代碼-->運(yùn)行時(shí)啟動(dòng)解釋器淀零,有解釋器邊解釋邊運(yùn)行;
根據(jù)其編程過(guò)程中功能的實(shí)現(xiàn)是調(diào)用庫(kù)還是調(diào)用外部的程序文件:
shell腳本編程:利用系統(tǒng)上的命令及編程組件進(jìn)行編程膛壹;
完整編程:利用庫(kù)或編程組件進(jìn)行編程驾中。
編程模型:過(guò)程式編程語(yǔ)言唉堪,面向?qū)ο蟮木幊陶Z(yǔ)言
程序 = 指令 + 數(shù)據(jù)
過(guò)程式:以指令為中心來(lái)組織代碼,數(shù)據(jù)是服務(wù)于代碼肩民;
順序執(zhí)行唠亚、選擇執(zhí)行,循環(huán)執(zhí)行
代表:C持痰,bash
對(duì)象式:以數(shù)據(jù)為中心來(lái)組織代碼灶搜,圍繞數(shù)據(jù)來(lái)組織指令;
類(class):實(shí)例化對(duì)象工窍;
代表:java割卖,python,c++
shell腳本編程特性:過(guò)程式編程患雏,解釋運(yùn)行鹏溯,依賴于外部程序文件運(yùn)行。
格式/如何寫:
腳本文件第一行頂格淹仑,給出shebang【解釋器路徑】用于指明解釋執(zhí)行當(dāng)前腳本的解釋器文件丙挽。
常見的解釋器:
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
文本編輯器:
行編輯器:sed
全屏幕編輯器:nano,vi匀借,vim
shell腳本是什么:
命令的堆積颜阐;
但很多命令不具有冥等性,所以需要程序邏輯來(lái)判斷運(yùn)行條件是否滿足吓肋,以避免其運(yùn)行中發(fā)生錯(cuò)誤
運(yùn)行腳本:
1瞬浓、賦予執(zhí)行權(quán)限,并直接運(yùn)行此程序
chmod +x /path/to/file
2蓬坡、直接運(yùn)行解釋器猿棉,將腳本以命令行參數(shù)傳遞給解釋器程序(無(wú)需增加執(zhí)行權(quán)限);
bash /path/to/file
注意:腳本中屑咳,除了shebang萨赁,余下所有以#開頭的行和空白行都會(huì)被視作注釋行而忽略,此即為注釋行兆龙;shell腳本的運(yùn)行是通過(guò)運(yùn)行一個(gè)子shell進(jìn)程實(shí)現(xiàn)的杖爽。
引申:為什么有些sh文件無(wú)法直接運(yùn)行: 1、沒有添加x權(quán)限紫皇,或當(dāng)前用戶不具備權(quán)限慰安;2、需要添加地址聪铺,因?yàn)槟J(rèn)系統(tǒng)會(huì)去環(huán)境變量找此命令化焕,但是可能不存在與環(huán)境變量目錄下。
bash的配置文件
兩類:
profile類:為交互式登錄shell進(jìn)程提供配置
全局:對(duì)所有用戶都生效铃剔;
/etc/profile
/etc/profile.d/*.sh
用戶個(gè)人:僅對(duì)當(dāng)前用戶有效撒桨;
~/.bash_profile
功用:
1查刻、用戶定義環(huán)境變量;
2凤类、運(yùn)行命令或腳本
bashrc類:為非交互式登錄的shell進(jìn)程提供配置
全局:
/etc/bashrc
用戶個(gè)人:
~/.bashrc
功用:
1穗泵、定義本地變量;
2谜疤、定義命令別名佃延。
僅管理員可以修改全局配置文件。
登錄類型:
交互式登錄shell進(jìn)程:
直接通過(guò)某終端輸入賬號(hào)密碼登錄打開的shell進(jìn)程夷磕;
使用su - username 或su -l username執(zhí)行的登錄賬號(hào)切換苇侵;
非交互式登錄shell進(jìn)程:
使用su usename執(zhí)行的登錄切換【這里沒有-】;
圖形界面下打開的終端企锌;
運(yùn)行腳本。
交互式登錄shell進(jìn)程配置文件讀取次序:
/etc/profile -- >/etc/profile.d/* -->~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式登錄shell進(jìn)程配置文件讀取次序:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*
命令行中定義的特性于未,例如變量和別名作用域?yàn)楫?dāng)前shell進(jìn)程的生命周期撕攒;
配置文件定義的特性,只對(duì)隨后新啟動(dòng)的shell進(jìn)程有效烘浦;
如果想通過(guò)配置文件定義的特性立即生效:
1抖坪、通過(guò)命令行重復(fù)定義一次;
2闷叉、讓shell進(jìn)程重讀配置文件:
source /path/to/conf_file
或 . /path/to/conf_file【這里的.即為source命令】
實(shí)踐驗(yàn)證擦俐,在profile文件中環(huán)境變量修改之后,source一下握侧,發(fā)現(xiàn)當(dāng)前session的環(huán)境變量還在蚯瞧,并且把新的這個(gè)環(huán)境變量增加上了。
巧用:如果想讓每個(gè)登錄用戶登陸時(shí)都能夠看到一行提示信息品擎,可以在/etc/profile.d/目錄 下新建一個(gè)例如welcom.sh的文件埋合,寫下echo “你想讓每個(gè)登錄用戶看到的信息”