shell基礎知識及使用方法
SHELL是使用者與作業系統之間完成互動式操作的一個接口程式,為使用者提供簡化了的操作。
第一代shell在上世紀70年代中于貝爾實驗室中誕生,名為bourne shell,簡稱sh,後期又衍生出多個版本,如csh,ksh等;而Linux系統中預設的shell程式是由GNU發行的bash,它是完全開源的。
下面就來說說bash的特性:
一:指令的别名--(自定義指令)
alias:(help alias查詢)定義或顯示别名
格式:alias [-p] [名稱[=值] ... ]
注意:如果alias指令不帶任何選項和參數,則表示顯示所有已經定義并生效的别名設定;使用如下:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SN0UDMzkTO5QTMfNXL08FctdXLz8Vb31CM4BDM18Fa31yZuBnL3UWZkJDOzYzN3YmZ5UmNmdDNxITN3kzNyEWY2MTM5QzLcdjMvwFMxcTMwIzLcN3cv9CXvwVbvNmLvR3YxUjL0M3Lc9CX6MHc0RHaiojIsJye.png)
unalias:從别名定義清單中删除每一個“名字“。它的用法和alias差不多。
注意:無論使用alias指令或unalias指令,其功能都會立即生效;此指令的生命期僅為目前shell的生命期;一旦登出登陸,相當于關閉bash,則使用alias指令定義的别名或使用unalias指令删除的别名操作,會立即失效;
對于每個使用者來說,都有一個私有的bash的配置檔案,在使用者家目錄中的一個隐藏檔案,檔案名為“.bashrc”,其主要功能時用來儲存指令的别名的定義;
二.bash 的快捷鍵;
c:ctrl鍵
M:alt鍵
E:esc鍵
DEL:backspace鍵
C-l:清屏,相當于clear指令;
C-a:将光标跳轉至指令行編輯模式的行首;
C-e:将光标跳轉至指令行編輯模式的行尾;
C-k:删除指令行編輯模式的光标所在位置至行尾的内容;
C-u:删除指令行編輯模式的光标所在位置至行首的内容;
C-c:結束前台程序;
M-:引用上一個指令的最後一個參數;
E:功能同M-;
三.指令曆史:
bash程序會儲存其會話的使用者曾經執行過的指令,,以友善使用者重複執行某個指令操作;
指令的曆史包括兩個方面:
1.使用者曾經執行過的指令;
2.使用者曾經執行過的指令的路徑;
在bash中有一個内置的變量--PATH,PATH變量的值為目前系統中所有的指令的檔案所在的路徑的集合;
指令是如何執行的?
bash會将指令行的内容按照空白符進行切片,分析第一個切片的内容;
1.判斷第一個切片的内容是内部指令還是外部指令;
如果是内部指令,則直接運作;
如果是外部指令,先找hash表中的路徑緩存,如果有,則直接執行,否則通過查找PATH變量中包含的路徑中,是否有對應名稱的檔案;
使用hash指令檢視被記住的指令檔案的路徑;
-r:忘記所有記住的位置;
使用history指令檢視被記住的指令的指令行參數;
history-顯示或操縱曆史清單。
格式:
history: history [-c] [-d 偏移量] [n] 或 history -anrw [檔案名] 或 history -ps 參數 [參數...]
常用選項:
-c:清空曆史緩沖區中的指令曆史記錄;
-d:删除指定的曆史指令條目;
重複執行曆史緩沖區的指令:
!NUMBER:重複執行曆史緩沖區中編号為“NUMBER”的指令;
!STRING:重複執行曆史緩沖區中以“STRING”開頭的最後一次 執行過的指令;
!?STRING:重複執行曆史緩沖區中包含了“STRING”的最後一次 執行過的指令;
!-NUMBER:重複執行曆史緩沖區中倒數第“NUMBER”條指令;
使用上下Arrow可以從曆史緩沖區調用指令,回車之 後執行;
C-r:在曆史緩沖區實施搜尋,回車之後執行;
!$:在曆史緩沖區中調用最後一個指令的最後一個參數;
!^:在曆史緩沖區中調用最後一個指令的第一個位置的參數;
!:NUMBER:在曆史緩沖區中調用最後一個指令的 第“NUMBER”個位置的參數;
在bash中與指令曆史相關的内置變量:
HISTSIZE:曆史緩沖區中能夠儲存的指令曆史的最大條目數量,默 認值為1000.
HISTFILESIZE:~/.bash_history檔案中能夠儲存指令曆史的最大 條目數量,預設值為1000;
HISTIMEFORMAT:在指令曆史緩沖區中記錄曆史指令時,同時記錄 指令的執行的時間的時間戳标記;可以使用date指令 的format來表示時間的記錄格式;預設值為空;
HISTCONTROL:控制指令曆史的記錄方式:
ignoredups:連續且相同的指令不會被記錄到曆史緩沖區;此為 預設值;
ignorespace:以空白字元開頭的指令不會被記錄到曆史緩沖區;
ignoreboth:上述兩種情況都不會被記錄到曆史緩沖區;
四.指令補全
1.構成指令字元串的補全;
參考PATH變量中的路徑,對指令進行補全;
如果,給出的字元串在PATH變量對應的路徑時唯一的,則直接補全指令;
如果,給出的字元串在PATH變量對應的路徑時不是唯一的,則bash給出提 示;
2.指令中參數所對應的字元串補全;
根據給出的路徑進行補全;
如果,給出的字元串在給出的路徑中是唯一的,則直接補全指令;
如果,給出的字元串在給出的路徑中不是唯一的,則bash給出提示;
五.指令行展開
1.~展開:
~:bash會自動将其展開為目前登陸使用者的家目錄;
~STRING:bash會将其自動的展開為以“STRING”為使用者名的使用者的家目 錄;
~+:調用bash的内置變量的“PWD”的值;
~-:調用bash的内置變量的“OLDPWD”的值;
2.{}展開:
在{}中,可以填充一個以“,”分割的路徑判斷清單,bash 會将其展開為 多個獨立的路徑;
1.txt{,.bak}==1.txt 1.txt.bak(cp)
*六.指令的執行結果
在bash中,指令的執行有兩種結果:
1.執行指令的輸出結果;
根據使用者的需求擷取到的指令執行的正常輸出結果;
指令引用或指令替換;
``(反向單引号)相當于$()
示例:建立一個檔案,檔案名為test-系統時間;
~]:#touch test-~date +%F+%H-%M-%S~
2.執行指令的狀态傳回值;
與此前的一個指令是否成功執行相關的傳回内容;
bash使用一個特殊的内置變量來儲存其内容:$?
$?實際上儲存的是一個數值,儲存範圍0-255
其中:
0:表示執行成功;
1-255:表示指令執行失敗;
1,2,127:bash中内置的指令執行的狀态傳回值;
1:表示小問題;
2:表示大問題;
127:表示指令本身出現問題;
其餘數字(3-126,128-255):使用者可以自定義的失敗狀态傳回值;
七.引用功能;
``:強引用;
凡是被單引号引用的内容,bash在處理時,一律将其視為普通字元,,及 其本身是bash定義的具有特殊功能和作用字元亦是如此,但單引号本身除 外
“”:弱引用;
被雙引号引用的内容中,有些特殊字元仍然胡保留其特殊含義,如$,\,"";
八.轉義功能;
\:bash定義的轉義字元;大多數情況下,\隻能将其後面的一個字元轉義;
\COMMAND取消定義過的,指令别名,而使用指令本身的功能;
*九.Globbing--檔案名通配符,簡稱glob;
*:比對任意長度的任意字元或字元串;(某些特殊位置的“.”字元不能 比對;)
?:比對任意單個字元;(某些特殊位置的“.”字元不能比對;)
[]:比對指定範圍内的任意單個字元,必須比對且隻能比對一個字元;
指定範圍的方法:
1.枚舉法:列出所有有效字元;
2.範圍指定
[0-9]:表示所有單個的十進制數字;
[a-z]:a,A,b,B,c,C.......y,Y,z
[A-Z]:A,b,B,c,C........z,Z
3.bash内建字元集;
[:lower:]:所有的小寫字母;
[:upper]:所有的大寫字母;
[:alpha]:所有字母,包括大小寫;
[:digit]:所有單個的十進制數字;
[:alnum:]:所有的字母和十進制數字;
[:punct:]:所有的符号;
[:space:]:表示空白字元,包括空格和制表符;
4.反向比對;
^
示例:#ls a [^[:digit:]]?? 表示檔案名的第二個字元不能是十進制數 字;
注意:當括号中有“^”表示字元集反向比對時,注意"*"的使用;因 為"*"通配範圍可能會導緻反向比對失敗,此類失敗是因為bashd的 globbing是在貪婪模式下比對的;
十.管道
|
管道通常是用來連接配接多個指令的,将管道符号前面的指令的執行的輸出結 果通過管道傳遞給管道符号後面的指令,讓後面的指令将前面的指令的輸 出結果當成參數使用;
wc:
wc - 輸出檔案中的行數、單詞數、位元組數
格式: wc [選項清單]... [檔案名清單]...
常用選項:
-c, --bytes, --chars輸出位元組統計數。
-l, --lines輸出換行符統計數;
-m:僅顯示檔案中有效字元的數量;
-w, --word:輸出單詞統計數;
注意:
1.一般來講,凡是被管道連接配接的指令,都應該能夠在執行成功之後完成命 令結果的輸出;否則管道無意義;
2.管道不是萬能的,有些場合無法使用管道;
十一.輸入輸出重定向
在使用計算機的時候,實作某個功能的主體是程式;
程式=指令+資料(資料至關重要!)
檔案,IO--輸入輸出
在Linux系統中,能夠完成輸入輸出功能的實體:檔案
可以用于輸入的裝置:檔案
鍵盤裝置,檔案系統中的正常檔案,網卡裝置,聲霸卡裝置,磁盤裝置等;
可以用于輸出的裝置:檔案
顯示器,檔案系統中的正常檔案,網卡裝置,聲霸卡裝置,磁盤裝置等;
在記憶體中使用檔案的方式是定義檔案描述符,一個檔案描述符對應一個文 件;
0:表示标準輸入,stdin,從鍵盤實作的輸入資料流;
1:表示标準輸出,stdout到顯示器的輸出資料流;
2:表示标準錯誤,stderr到顯示器的錯誤資料流;
輸入輸出重定向(IO重定向)
采用非标準裝置檔案實作的IO操作;
輸入重定向:
<
輸出重定向:
>:覆寫輸出重定向;
~]# set -C 開啟防止意外覆寫源檔案開關,可以使用“>|”符号完成 覆寫重定向輸出操作,而無需關心是否開啟此開關;
>>:追加輸出重定向;
錯誤重定向:
2>:覆寫錯誤重定向;
2>>:追加錯誤重定向;
合并标準輸出和标準錯誤的重定向;
1.COMMAND{>|>>}/PATH/TO/SOMEFILE 2>&1
2.&>,&>>
特殊的裝置檔案;
/dev/null: BlackHole,Bitbucket(位桶);
/dev/zero:泡泡機,吐零機;
bash中的其他特殊符号:
*<<:here document:此處文檔,結束标記;
<<<:here string,此處字元串,結束标記;
上述就是我的收獲,但是還有很多沒有弄清楚,在後期我會多加練習,再加以修改。