#4 什么是shell与bash的特性
Shell:
? 操作接口,為用戶提供簡單易用的操作界面,
? Bell實驗室:bourne shell --> sh
? Bill joy:C shell --> csh --> tcsh
? David korn:korn shell --> ksh
? Gun:bourne again shell --> bash(默認的Linux標準shell)
? Zsh:
默認系統(tǒng)中所支持的shell:
? ~]# cat /etc/shells
bash特性:
一、命令別名(自定義命令)alias(查看別名命令)
alias命令可以用來定義和顯示命令的別名。
但是使用alias命令定義的別名,其生命期僅為當前shell的生命期;
對于每個用戶來說,都有一個私有的bash配置文件,用于保存別名:
? ?~/.bashrc
注意:
? ?1.alias命令的效果僅限于當前shell的生命期;
? ?2.如果修改.bashrc配置文件,其中保存的別名并不會立即生效,只有在重新加載該文件的內(nèi)容之后,才會生效,且永久生效;
? ?3.為了能夠保證我們設置的別名永久有效,通常兩種操作都要做;
?
撤銷別名:
unalias:
unalias:name(別名名稱)
二、命令歷史:
Bash進程會保存其會話中用戶曾經(jīng)執(zhí)行過的命令,以方便用戶重復執(zhí)行某個命令;
通過bash提供的歷史命令文件來持久保存此前執(zhí)行過的命令,每個用戶都有其自己私有的歷史文件;
登錄shell的時候,bash會自動讀取~/.bash_history文件中所記錄的所有命令;
history命令:
? ? -c:清空歷史緩沖區(qū)中的歷史命令;
? ? -d offset:刪除特定歷史命令條目;
重復執(zhí)行前一個命令的方法:
? ? 1.使用上方向鍵,回車執(zhí)行;
? ? 2.Ctrl+p,回車執(zhí)行;
? ? 3.!-1,回車執(zhí)行;
? ? 4.!!,回車執(zhí)行;
重復執(zhí)行歷史緩沖區(qū)中的命令:
? ? !#(數(shù)字)重復執(zhí)行歷史命令中編號為“#”的命令
? ? !string(字符串):從歷史緩沖區(qū)中查找最近一次執(zhí)行過的以“String”開頭的命令,并執(zhí)行;
? ? !?string(字符串):從歷史緩沖區(qū)中查找最近一次執(zhí)行過的包含“String”的命令,并執(zhí)行;
? ? !-#(數(shù)字):重復執(zhí)行歷史緩沖區(qū)中倒數(shù)第“#”條命令;
Ctrl+r:在歷史緩沖區(qū)中實施搜索,回車執(zhí)行即可;
? ? ? ?
重復使用歷史命令中的一部分:
? ? ? ? !$:表示最后一次命令中最后一個參數(shù);
? ? ? ? 先按ECS,然后按.:表示最后一次命令中最后一個參數(shù);
? ? ? ? Alt+.:表示最后一次命令中最后一個參數(shù);
? ? ? ? !^:表示第一個位置的參數(shù)
? ? ? ? !:#(數(shù)字):表示最后一次命令中第“#”個位置的參數(shù);
? ? ? ? !#(數(shù)字):#(數(shù)字):表示在歷史緩沖區(qū)中第“#”個命令的第“#”個參數(shù)
? ? ? ? !string(字符串):^|$|*|#:
與歷史相關的bash變量:
? ? ? ? Histsize;
? ? ? ? Histfilesize;
? ? ? ? Histtimeformat;
? ? ? ? ? ? ? Histtimeformat=“%F %T”(顯示時間)
? ? ? ? Histcontrol;
? ? ? ? ? ? ?ignoredups:忽略連續(xù)且相同的命令的歷史緩存;
? ? ? ? ? ? ?ignorespace:忽略以空白字符開頭的命令;
? ? ? ? ? ? ?ignoreboth:以上兩個功能都啟用;
三、快捷鍵
? ? ?C-->Ctrl
? ? ?M-->Alt
? ? ?E-->Esc
? ? ?del-->backspace
在命令行模式下使用的快捷鍵:
C-l:clear,清屏;
C-a:將光標跳轉(zhuǎn)至命令行的行首;
C-e:將光標跳轉(zhuǎn)至命令行的行尾;
c-u:刪除光標所在位置至行首的命令行信息;
C-k:刪除光標所在位置至行尾的命令行信息;
C-c:結(jié)束前臺進程,取消命令的運行;
四、命令補全機制:
? ? ?兩個方面的理解:
? ? ? ? 命令本身的字符串的補全
? ? ? ? 參數(shù)的補全
shell命令的執(zhí)行過程:
? ? ?1.Shell會根據(jù)用戶鍵入“enter”來判斷用戶的輸入結(jié)束;
? ? ?2.shell會將收集的命令信息,根據(jù)空白字符來分段(token),第一分段被理解為命令字段;
? ? ?3.判斷第一字段是內(nèi)部命令還是外部命令,如果是內(nèi)部命令,則直接運行,如果是外部命令,通過path變量所指示的路徑信息,去查找相關的位置,以確定是否存在同名文件,如果有,就執(zhí)行;否者就報錯;
? ? ?4.判斷選項是否正確,判斷參數(shù)是否正確;
使用tab鍵可以完成命令補全:
如果給出的字符串不能作為唯一的標識,則bash不予補全;再次敲擊tab鍵,bash會給出參考列表;如果參考列表中的內(nèi)容過多,bash會詢問是否顯示該列表;
根據(jù)提供的參數(shù)路徑來進行補全,如果參數(shù)沒有任何提示信息,則默認從工作目錄進行查找;
五、命令行展開:
? ? ?~:bash會自動將其展開為當前登錄用戶的家目錄;
? ? ?~string(字符串):bash會自動將其張開為以“string”為用戶名的家目錄;
? ? ?~+:調(diào)用shell變量“pwd”的值;
? ? ?~-:調(diào)用shell變量“oldpwd”的值;
? ? ?{}:在花括號中可以填充一個以“,”分隔的路徑列表,bash會將其展開為多個獨立的路徑
? ??
六、命令的執(zhí)行結(jié)果:
? ? ? ? ? 任何一個Linux命令都有兩種執(zhí)行結(jié)果;
? ? ? ? ? ? ? 其一:命令的正常輸出結(jié)果;
? ? ? ? ? ? ? ? 跟用戶需求相關的返回內(nèi)容;
? ? ? ? ? ? ? ? ``(英文狀態(tài)下~鍵):反向單引號,反引號
? ? ? ? ? ? ? ? $():標準的命令引用格式
wc:統(tǒng)計一個文件中的行數(shù)、字數(shù)及字節(jié)數(shù);
? ? ? ? ? ?-c:只顯示字節(jié)數(shù);
? ? ? ? ? ?-l:只顯示行數(shù);
? ? ? ? ? ?-w:只顯示字數(shù);
?
? ? ? ? ? ? ? 其二:命令的執(zhí)行狀態(tài)返回值;
? ? ? ? ? ? ? ? 跟命令執(zhí)行成功與否相關的返回內(nèi)容;
? ? ? ? ? ? ? ? 保存在bash的一個特殊變量中:$?
? ? ? ? ? ? ? ? 0:命令執(zhí)行成功
? ? ? ? ? ? ? ? 1,2,127:bash內(nèi)置狀態(tài)返回值;
? ? ? ? ? ? ? ? ? ?1:表示小問題
? ? ? ? ? ? ? ? ? ?2:表示嚴重問題
? ? ? ? ? ? ? ? ? ?127:表示命令本身問問題;
? ? ? ? ? ? ? ? 3-126,128-255:用戶自定義狀態(tài)信息;
七、引用功能:
‘’:強引用
? ? ?凡是被單引號引用的內(nèi)容,bash一律將其視為普通字符,即便其本身有特殊功能和作用也是如此。但單引號本身是個例外。
?“”:弱引用
? ? ?被雙引號引用的內(nèi)容中,有些特殊字符仍然會保留其特殊含義,比如說:$、\、”
八、轉(zhuǎn)義功能:
? ? ? ? ?\:bash中定義的轉(zhuǎn)義字符:只能使其后一個字符失去特殊意義;
九、Globbing(文件名通配,簡稱為glob):
? ? ? ? ? 元字符(基本字符):
? ? ? ? ? ? ? *:匹配任意長度的任意字符,某些特殊位置的“.”字符不能被匹配;
? ? ? ? ? ? ? ?:匹配任意單個字符,必須且只有一個字符被匹配;
? ? ? ? ? ? ?[]: 匹配指定范圍內(nèi)的任意單個字符,必須且只有一個字符被匹配
? ? ? ? ? ? ? ? ? ? ?在“[]”中范圍的顯示的模式:
? ? ? ? ? ? ? ? ? ? ? [a-z]:a,A,b,B,c,C...y,Y,z
? ? ? ? ? ? ? ? ? ? ? [A-Z]:A,b,B,c,C…y,Y,z,Z
? ? ? ? ? ? ? ? ? ? ? 字符集:
? ? ? ? ? ? ? ? ? ? ? ? [:lower:]:表示所有小寫字字母;
? ? ? ? ? ? ? ? ? ? ? ? ? ? [[:lower:]]:通配任意單個小寫字母;
? ? ? ? ? ? ? ? ? ? ? ? [:upper:]:表示所有的大寫字母;
? ? ? ? ? ? ? ? ? ? ? ? ? ? [[:upper:]]:通配任意單個大寫字母;
? ? ? ? ? ? ? ? ? ? ? ? [:alpha:]:表示所有字母字符;
? ? ? ? ? ? ? ? ? ? ? ? [:digit:]:表示所有的十進制數(shù)字 ? ?10
? ? ? ? ? ? ? ? ? ? ? ? [:alnum:]:表示所有的大小寫字母以及十進制數(shù)字
? ? ? ? ? ? ? ? ? ? ? ? [:space:]:表示空白字符
? ? ? ? ? ? ? ? ? ? ? ? [:punct:]:表示所有的標點符號
? ? ? ? ? ? ? ? ? ? ? ? ^: 取反匹配,[^]表示不要的意思
十、輸入輸出重定向:
? ? ? ? ? 在使用計算機的時候,實現(xiàn)某種功能的主題是:程序
? ? ? ? ? 程序=指令+數(shù)據(jù) ? ? ? ??
? ? ? ? ? 數(shù)據(jù):文件,io
? ? ? ? ?可以用于輸入的設備:文件
? ? ? ? ? ?鍵盤文件、文件系統(tǒng)中的常規(guī)文件、網(wǎng)卡設備、聲卡設備等;?
? ? ? ? ?可以用于輸出的設備:文件
? ? ? ? ? ?顯示器、文件系統(tǒng)中的常規(guī)文件、網(wǎng)卡設備、聲卡設備等;
? ? ? ? ?每一種程序都有三種形式的數(shù)據(jù)流:
? ? ? ? ? ?輸入數(shù)據(jù)流:為程序獲取數(shù)據(jù)的數(shù)據(jù)流;默認的輸入數(shù)據(jù)流的來源就是鍵盤;
? ? ? ? ? ?輸出數(shù)據(jù)流:將程序所處理的數(shù)據(jù)結(jié)果展示給用戶的數(shù)據(jù)流;默認的輸出數(shù)據(jù)流的終點是顯示器;
? ? ? ? ? ?錯誤數(shù)據(jù)流:將程序無法處理或處理過程中出現(xiàn)問題的結(jié)果展示給用戶的數(shù)據(jù)流:默認的錯誤數(shù)據(jù)流的終點是顯示器;
? ? ? ? ? ?從鍵盤實現(xiàn)的輸入數(shù)據(jù)流稱為標準輸入; ? ?
? ? ? ? ? ?到顯示器上的輸出數(shù)據(jù)流稱為標準輸出;
? ? ? ? ? ?到顯示器上的錯誤數(shù)據(jù)流稱為標準錯誤輸出,簡稱標準錯誤;
? ? ? ? ? ? ??
? ? ? ? ? ?文件描述符:file descriptor,簡稱:FD
? ? ? ? ? ? ? 0:標準輸入,stdin
? ? ? ? ? ? ? 1:標準輸出,stdout
? ? ? ? ? ? ? 2:標準錯誤,stderr
? ? ? ? ? ?IO重定向:采用非標準設備文件實現(xiàn)的IO操作;
? ? ? ? ? ??
? ? ? ? ? ?簡單來說:
? ? ? ? ? ? ?不是從鍵盤設備完成的數(shù)據(jù)流輸入就可以稱為輸入重定向或重定向輸入;
? ? ? ? ? ? ?不是到顯示器設備的正確輸出數(shù)據(jù)流就被稱為輸出重定向或重定向輸出; ? ? ? ? ??
? ? ? ? ? ? ?不是到顯示器設備的錯誤輸出數(shù)據(jù)流就被稱為錯誤重定向或重定向錯誤;
? ? ? ? ? ? ? ? >:覆蓋輸出重定向
? ? ? ? ? ? ? ? ~]# set -C ? ? ? ?//開啟防誤覆蓋開關
? ? ? ? ? ? ? ? ? 在此開關開啟后,可以使用“>”符號繼續(xù)覆蓋重定向
? ? ? ? ? ? ? ? ~]# set +C ? ? ? ?//關閉防誤覆蓋開關
? ? ? ? ? ? ? ?>>:追加輸出重定向
?
? ? ? ? ? ? ? ?錯誤重定向:
? ? ? ? ? ? ? ? ?2>:覆蓋錯誤重定向;
? ? ? ? ? ? ? ? ?2>>: 追加錯誤重定向;
? ? ? ? ? ? ? ? 合并標準輸入和標準輸出的重定向:
? ? ? ? ? ? ? ? ?1)&>,&>> ? (4.0以上的bash才支持的符號)
? ? ? ? ? ? ? ? ?2)command >|>> path/to/somefile 2>&1
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? /dev/null:blackhole,bitbucket(位桶 垃圾桶),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? Ls /tmp/a.txt &> /dev/null
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?||(等號)
? ? ? ? ? ? ? ? Ls /tmp/a.txt > /dev/null 2>&1
?
? ? ? ? ? ? ? ? 輸入重定向:
? ? ? ? ? ? ? ? ? ? <:
? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? <<:here document(此處文檔)?
? ? ? ? ? ? ? ? ? ?<<<:here string(此處字符串)
十一、管道
? ? ? ?|:
? ? ? ? ? Command1 | command2 | command3 | ...
? ? ? ? 注意:所有的用于管道連接的命令,都應該是能夠有標準輸出數(shù)據(jù)流的命令;
??
? ? ? ? ? ? ? ? ? tee:T
十二、變量
? ? ? ? ?變量:一段連續(xù)的內(nèi)存空間,cell--8bit,為這一段內(nèi)存空間取名,稱為變量名;在這段內(nèi)存空間中所儲存的數(shù)據(jù),稱為變量值;
? ? ? ? ?賦值操作:
? ? ? ? ? ? =:賦值操作符
? ? ? ? ? ? 賦值方法:VARNAME=VALUE(中間不能加括號)
? ? ? ? ? ? VARNAME的命名規(guī)范:
? ? ? ? ? ? ? ?1.只能以字符或“_”為首字符,不能使用數(shù)字,后面可以使任意字母、數(shù)字和下劃線;
? ? ? ? ? ? ? ?2.大小寫嚴格區(qū)分:
? ? ? ? ? ? ? ?3.見名知意;
? ? ? ? ? ? ? ?4.書寫規(guī)范;?
? ? ? ? ? ? ? ? ?1)全大寫:FILES
? ? ? ? ? ? ? ? ?2)駝峰式:Myfiles
? ? ? ? ? ? ? ?5.不能與已知變量名相同
? ? ? ? ?
? ? ? ? ?根據(jù)不同的編程語言,變量可以分為兩類;
? ? ? ? ? ?強變量: ?
? ? ? ? ? ? ? 必須在使用前先聲明,而且要聲明其類型,嚴格區(qū)分變量類型;
? ? ? ? ? ? ? 255
? ? ? ? ? ? ? ? ?字符類型:3Bytes
? ? ? ? ? ? ? ? ?整數(shù)型:1Bytes 11111111
? ? ? ? ? ? ? ? ?null ? ? ? ?
? ? ? ? ? ?弱變量:可以隨時使用隨時聲明,甚至可以不聲明即使用;不對變量類型做硬性要求,如果沒有指明變量類型,統(tǒng)一按照字符型對待;
? ? ? ? ? ?bash的變量即為弱變量;
? ? ? ? ? ?python
? ? ? ? ? ?應用變量的值:$(VARNAME)==>$VARNAME,也稱為變量替換;
? ? ? ? ? ?bahs的變量種類:
? ? ? ? ? ? ?全局標量(環(huán)境變量):作用范圍是整個shell進程,包括其子shell;
? ? ? ? ? ? ?本地變量:作用范圍僅僅只是當前登錄的shell,不包含子shell;
? ? ? ? ? ? ?局部變量:作用范圍僅僅只是當前的程序段,一般用于函數(shù);
? ? ? ? ? ? ?默認全局變量:
? ? ? ? ? ? ? ?位置參數(shù)變量:$1,$2,$3,...$n
? ? ? ? ? ? ? ?特殊變量:
? ? ? ? ? ? ? ? ?$?,$#,$*,$@,$$,...
? ? ? ? ? ? ? ? ?$?:展開為最近一次所執(zhí)行的命令的狀態(tài)返回值(退出狀態(tài));
? ? ? ? ? ? ? ? ?$#:位置參數(shù)的個數(shù),以十進制表示;
? ? ? ? ? ? ? ? ?$*:從1開始展開為位置參數(shù)。當使用雙引號引用展開的時候,它展開為以特殊變量“IFS”的第一個字符分隔的值
? ? ? ? ? ? ? ? ?$@:從1開始展開為位置參數(shù)。當使用雙引號引用展開的時候,它展開為一個單獨的字符串;
? ? ? ? ? ? ? ? ?$$:展開為當前shell的進程標識服;
? ? ? ? ? ? ? ? ?$0:展開為shell或者shell腳本的文件名;
? ? ? ? ? ? ?
? ? ? ? ? ? 變量的使用:
? ? ? ? ? ? ? 聲明本地變量;
? ? ? ? ? ? ? ? 變量的賦值:VARNAME=VALUE,
? ? ? ? ? ? ? 撤銷變量:~]# unset VARNAME ?
? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? 聲明環(huán)境變量:
? ? ? ? ? ? ? ? export VARNAME
? ? ? ? ? ? ? ? export VARNAME=VALUE
? ? ? ? ? ? ? ? declare
? ? ? ? ? ? ? ? ? ?-a:聲明索引數(shù)組(如果支持);
? ? ? ? ? ? ? ? ? ?-A:聲明關聯(lián)數(shù)組(如果支持);
? ? ? ? ? ? ? ? ? ?-i:聲明整型變量;
? ? ? ? ? ? ? ? ? ?-l:聲明變量并將變量值中的字母轉(zhuǎn)換為小寫字母;
? ? ? ? ? ? ? ? ? ?-u:聲明變量并將變量值中的字母轉(zhuǎn)換為大寫字母;
? ? ? ? ? ? ? ? ? ?-x:聲明變量并將其導出為環(huán)境變量;
? ? ? ? ? ? ? ? ? ?-r:聲明變量為只讀變量(常量);
? ? ? ? ? ? ? 查看環(huán)境變量:
? ? ? ? ? ? ? ? set:
? ? ? ? ? ? ? ? export:
? ? ? ? ? ? ? ? enV:?
? ? ? ? ? ? ? 聲明局部變量:
? ? ? ? ? ? ? ? local VARNAME=VALUE
? ? ? ? ? ? ? 配置文件:
? ? ? ? ? ? ? ? 通用配置文件:/etc/bashrc、/etc/profile
? ? ? ? ? ? ? ? 私人配置文件:~/.bashrc、~/.bash_profile
? ? ? ? ? ? ? 注意:一般情況下,聲明變量都是現(xiàn)做現(xiàn)用,并不需要改配置文件;
十三、bash的特性之多命令執(zhí)行;
? ? ~]# COMMAND1 $(COMMAND2)
? ? ~]# COMMAND1|COMMAND1...進程之間通信(IPC)
? ? 順序執(zhí)行結(jié)構(gòu):
? ? ? ~]# COMMAND1;COMMAND2;...
? ? 選擇執(zhí)行結(jié)構(gòu):
? ? ? 邏輯運算:
? ? ? ? 與:邏輯乘法,&&,雙目運算符
? ? ? ? ? ? 0:SUCCESS --> true(真)
? ? ? ? ? ? 1-255:FAILURE --> false(假)
? ? ? ? ? ? true && true = true
? ? ? ? ? ? true && ?false = false
? ? ? ? ? ? false && true = false?
? ? ? ? ? ? false && false = false
? ? ? ??
? ? ? ? ?“與”的短路邏輯運算:只要第一個操作數(shù)為false,則其邏輯運算的結(jié)果一定為false;
? ? ? ? ?COMMAND1 && COMMAND2
? ? ? ? ? ?如果COMMAND1能夠成功執(zhí)行,則COMMAND2會被執(zhí)行;
? ? ? ? ? ?如果COMMAND1執(zhí)行失敗,則COMMAND2不會被執(zhí)行;
? ? ? ? ?! COMMAND1 && COMMAND2?
? ? ? ? ? ?如果COMMAND1能夠成功執(zhí)行,則COMMAND2不會被執(zhí)行;
? ? ? ? ? ?如果COMMAND1執(zhí)行失敗,則COMMAND2會被執(zhí)行;
? ? ? ? 或:邏輯加法,||,雙目運算符
? ? ? ? ? ? true || true = true?
? ? ? ? ? ? true || false = true?
? ? ? ? ? ? false || true = true ? ? ? ? ? ??
? ? ? ? ? ? false || false = false
? ? ? ? ?“或”的短路邏輯運算;只要第一個操作數(shù)為true,則其邏輯運算的結(jié)果一定為true;
? ? ? ? ?COMMAND1 || COMMAND2?
? ? ? ? ? ?只要COMMAND1能夠成功執(zhí)行,COMMAND2就沒有必要執(zhí)行了;
? ? ? ? ? ?只有當COMMAND1執(zhí)行失敗的時候,COMMAND2才會被執(zhí)行;
? ? ? ? ?! COMMAND1 || COMMAND2
? ? ? ? ? ?如果COMMAND1能夠成功執(zhí)行,則COMMAND2會被執(zhí)行;
? ? ? ? ? ?如果COMMAND1執(zhí)行失敗,則COMMAND2不會被執(zhí)行;
? ? ? ? 非:邏輯取反,!,單目運算符
? ? ? ? ? !STRING:讀取命令歷史空間的內(nèi)容;
? ? ? ? ? ? ! true = false
? ? ? ? ? ? ! false = true
? ? ? ? ? ? ! COMMAND
? ? ? ? ? ? ! COMMAND1 && COMMAND2 相對于 COMMAND1 || COMMAND2?
? ? ? ? ? ? ! COMMAND1 || COMMAND2 相對于 COMMAND1 && COMMAND2?
? ? ? ? 德摩根丁璐:
? ? ? ? ? ! (A && B) == ! A || ! B
? ? ? ? ? ! (A || B) == ! A && ! B
? ? ? ? 邏輯運算符號優(yōu)先級:
? ? ? ? ? ? ! > &&> ||
? ? ? ? 異或:雙目運算符
? ? ? ? ? 比對兩個操作數(shù)是否不同;如果不同,則邏輯運算結(jié)果為真;如果相同,則邏輯運算結(jié)果為假;?
轉(zhuǎn)載于:https://blog.51cto.com/12486569/1908686
總結(jié)
以上是生活随笔為你收集整理的#4 什么是shell与bash的特性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 知识点的积累(零碎的积累)
- 下一篇: Markdown —— 开源者必备的文字