SHELL:
一方面指使用者與作業系統之間完成互動式操作的接口程式的統稱,可以為使用者提供簡化的操作;
另一方面指shell也是一種程式語言;
在上世紀70年代中期,著名的實驗室中的實驗人員Bourne發明了bourne shell程式,簡稱sh;之後美 國計算機科學家 Bill joy根據bourne shell用C語言重新編譯C bourne shell,簡稱csh,後來的衍生版 名為tcsh;之後David korn集合csh和sh的優點發明korn shell,簡稱ksh;開源組織GNU在比較這幾 代的shell程式後發明bourne again shell,簡稱bash,進而成為Linux系統中預設的shell程式;再然後 進階為zsh,也是最終shell,功能非常強大;因為bash是Linux中的預設shell程式,先入為主,zsh并 沒有撼動bash的預設地位。
目前系統中所有可以支援的安全shell:
cat /etc/shells
注意:除了/sbin/nologin之外,其他shell都可以用來測試使用:
在更換shell時,最好在bash中更換其他shell
;
如果已經換成了其他shell,就使用exit指令傳回至bash,再行切換
切勿進行一下切換方式,這種方式是錯誤的,會對系統造成很大的壓力和負荷
如上的連續的shell程式切換,隻是在已經切換的tcsh中又打開了csh的shell程式,又在csh中打開了bash程式,會對系統造成很大的壓力,之後隻要按如下操作退出,可以以echo $0的指令來檢視目前使用的shell程式,如下:
BASH的特性:
一、指令的别名--(自定義指令)
alias:
定義或顯示别名
指令格式:
alias [-p] [名稱[=值] ... ]
注意:如果alias指令不帶任何選項和參數,則表示顯示所有已經定義并生效的别名設定;
# alias ALIAS='COMMAND [OPTION]...[ARGUMENT]...'
上圖中,我們自定義指令mp等價于複制目錄的指令‘mkdir -p’,在
unalias:
從别名定義清單中删除每一個“名字‘
unalias [-a] 名稱 [名稱 ...]
注意:
無論使用alias指令還是unalias指令,其功能都會立即生效;此二指令的生命期僅為目前shell的生命期,一旦登出登入,就相當于關閉了bash,則使用alias指令定義的别名或使用unalias指令删除的别名操作,會立即失效;
對于每個使用者來說,都有一個私有的bash的配置檔案,就在使用者的家目錄中的一個隐藏檔案,檔案名為“.bashrc”,其主要功能是用來儲存指令的别名。
注意:
在對于此檔案中的指令别名進行編輯并儲存之後,在目前已經運作的bash中并不會立即生效,需要重新加載此檔案才能使配置生效,以下兩種操作皆可實作:
1.重新開機bash:登出之後再次登入即可:
2.執行檔案中定義的指令:使用source或.;
source/. :
在目前 shell 中執行一個檔案中的指令;
格式:
source 檔案名 [參數]
. 檔案名 [參數]
二、bash的快捷鍵:
C:Ctrl鍵
M:Alt鍵
E:Esc鍵
DEL:backspace鍵
C+l:清屏,Ctrl+L;
C+a:将光标跳轉至指令行編輯模式的行首;
C+e:将光标跳轉至指令行編輯模式的行尾;
C+k:删除光标所在位置至行尾的内容;
C+u:删除指令行編輯模式的光标所在位置至行首的内容;
C+c:結束前台程序;
M+.:引用上一個指令中的最後一個參數;(在Xshell中不可使用)
Esc+.:引用上一個指令中的最後一個參數(功能同M+.);
三、指令曆史:
bash程序會儲存其會話中的使用者曾經執行過的指令,以友善使用者重複執行某個指令操作;
指令曆史包括兩個方面:
1.使用者曾經執行過的指令;
2.使用者曾經執行過的指令的路徑;
在bash中有一個内置的變量--PATH,PATH變量的值為目前所有系統中所有指令的檔案的所在路徑的集合
shell程式執行指令的過程:
bash會将指令行的内容按照空白字元進行切片,分析第一個切片内容:
1.判斷第一個切片的内容是外部指令還是外部指令;
如果是内部指令,直接執行;
如果是外部指令,先找hash表中的路徑緩存,如果有,則直接執行;否則需要通過查找PATH變量中包含路徑中
,是否有對應名稱的檔案;
使用hash指令檢視被記住的指令檔案的路徑:
-r:清空hash表;
使用history指令檢視被記住的指令的指令行參數;
history:
顯示或操縱曆史清單;
格式:
history [-c] [-d 偏移量] [n] 或 history -anrw [檔案名] 或 history -ps 參數 [參數...]
常用選項:
-c:删除所有條目進而清空曆史清單;
-d OFFSET 偏移量:從指定位置删除曆史清單
(如圖所示,原來所在的198行的曆史*已被删除);
重複執行曆史緩沖區中的指令:
!NUMBER:重複執行曆史緩沖區中編号為“NUMBER”的指令
!STRING:重複執行曆史緩沖區中以“STRING”開頭的最後一次執行過的指令
!-NUMBER:重複執行曆史緩沖區中倒數第“NUMBER”條指令
使用上、下箭頭可以從曆史緩沖區中調用指令,回車之後執行;
C+r:在曆史緩沖區中實施搜尋,回車之後執行
!$:在曆史緩沖區中調用最後一個指令的最後一個參數
!^:在曆史緩沖區中調用最後一個指令的第一個位置的參數
!:NUMBER:在曆史緩沖區中調用最後一個指令的第“NUMBER”位置的參數
!SEQUENCE:NUMBER:在曆史緩沖區中調用第“SEQUENCE”條指令的第“NUMBER”位 置的參數
(在曆史緩沖區中223條位置的 第二條指令);
在bash中與指令曆史相關的内置變量:
HISTSIZE:曆史緩沖區中能夠儲存的指令曆史的最大條目數量,預設1000
;
HISTFILESIZE:~/.bash_history檔案中能夠儲存的指令曆史的最大條目數,預設是1000;
HISTTIMEFORMAT:在指令曆史緩沖區中記錄曆史指令時;同時記錄指令的執行的時間戳标記;可以使用date指令的FORMAT來表示時間的記錄格式,預設值為空
;
HISTCONTROL:控制指令曆史的記錄方式
ignoredups:忽略連續且相同的指令被記錄到曆史緩沖區;此為預設值;
ignorespace:忽略以空白字元開頭的指令不會被記錄到曆史緩沖區;
ignoreboth:上述兩種情況都不會被記錄到曆史緩沖區;
四、指令補全(Tab鍵的使用:單擊補全,輕按兩下補出所有可能的内容):
1、構成指令字元串的補全;
參考PATH變量中的路徑,對指令進行補全:
如果給出的字元串是PATH變量中對應的路徑是唯一的,則直接補全指令;
如果給出的字元串是PATH變量中對應的路徑不唯一,則bash給出提示;
2、指令中參數所對應的字元串的補全;
根據給出的路徑進行補全:
五、指令行展開:
1.~展開:
~:bash會自動将波浪線展開為目前登入使用者的家目錄 ;
~STRING:bash會自動将其展開為以“STRING”為使用者名的使用者的家目錄
(左圖為使用者cl家目錄中的目錄清單);
利用getent passwd指令來檢視目前系統内的所有使用者,如下:
~+:調用bash的内置變量“PWD”的值;
~-;調用bash的内置變量“OLDPWD”的值;
2.{}展開:
在“{}”中,可以填充一個以","來分隔的路徑清單,bash會将其展開為多個獨立的路徑;
示例:
mkdir -pv /china/{hb,hn,jl,hlj,ln}/{link,linka,linkb}/class18
# cp 1.txt{,.bak}
1.txt{,bak} == 1.txt 1.txt.bak
六、指令的執行結果
在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在處理時,
有些特殊字元仍然會保留其特殊含義,如$,\,"";
八、轉義功能:
\:bash定義的轉義字元;大多數情況下,“\”隻能将其後面一個字元轉義;
\COMMAND:取消定義過的指令别名,而使用指令本身的功能;
上圖就是反斜線發揮作用的結果;
九、Globbing--檔案名通配符,簡稱為glob;
*:比對任意長度的任意字元或字元串;(某些特殊位置的“.”字元不能比對;)
?:比對任意單個字元;(不能比對“.”)
[]:比對指定範圍内的任意單個字元,必須比對且隻能比對一個字元;
指定範圍的方法:
1、枚舉法:列出所有有效字元;
2、範圍指定:
[0-9]:表示所有單個的十進制數字;
[a-z]:除大寫Z外的所有英文字母無論大小寫;
[A-Z]:除小寫字母a外的所有英文字母無論大小寫;
3、bash内建字元集:
[:lower:]:所有的小寫字母;
[:upper:]:所有的大寫字母;
[:alpha:]:所有的字母,包括大小寫;
[:digit:]:所有單個的十進制數字;
[:alnum:]:所有的字母和十進制數字;
[:punct:]:所有的符号;
[:space:]:空白字元,包括空格和制表符;
4、反向比對:
^ 示例:ls a[^[:digit:]]?? //表示檔案名的第二個字元不能是十進制數字
注意:當中括号中有脫字元有“^”表示字元集反向比對時,注意“*”的使用;因為“*”的通配範圍可能會導緻反向比對失敗;此類失敗是因為bash的globbing是在貪婪模式下比對的;
十、管道
|
管道通常用來連接配接多個指令的,将管道符号前面的指令的執行的輸出結果通過管道傳遞給管道符号後面的指令,讓後面的指令将前面的指令的輸出結果當成參數來使用;
wc:
print newline, word, and byte counts for each file
格式:
wc [OPTION]... [FILE]...
常用選項:
-c, --bytes:僅顯示檔案中的位元組數;
-m, --chars:僅顯示檔案中的有效字元的數量;
-l, --lines:僅顯示檔案中的行數;
-w, --words:僅顯示檔案中的數量;
注意:1、一般來講,凡是被管道連接配接的指令,都應該能夠執行成功之後完成指令結果的輸出,否則管道無意義;
2、管道不是萬能的,有些場合沒辦法使用管道的;
十一、輸入輸出重定向
在使用計算機的時候,實作某個功能的主體是程式!
程式=指令 + 資料
資料至關重要!
檔案,IO---輸入input和輸出output
在Linux系統中,能夠完成輸入和輸出功能的實體:檔案;
可以用于輸入的裝置:檔案
鍵盤裝置、檔案系統中的正常檔案、網卡裝置、聲霸卡裝置等;
可以用于輸出的裝置:檔案
顯示器、檔案系統中的正常檔案、網卡裝置、聲霸卡裝置、磁盤裝置等;
在記憶體中使用記憶體的方法是定義檔案描述符,一個檔案描述符就對應一個檔案;
0:表示标準輸入,stdin,從鍵盤實作的輸入資料流;
1:表示标準輸出,stdout,到顯示器的輸出資料流;
2:表示标準錯誤,stderr,到顯示器的錯誤資料流
輸入輸出重定向(IO重定向)
采用非标準裝置檔案實作的IO操作;
輸入重定向:
<
輸出重定向:
>:覆寫輸出重定向;
set -C:開啟防止意外覆寫源檔案開關,可以使用">|"符号完成覆寫重定向
set +C:開啟防止意外覆寫源檔案開關;
>>:追加輸出重定向;
錯誤重定向:
2>:覆寫錯誤重定向;
2>>:追加錯誤重定向;
合并标準輸出和标準錯誤的重定向:
1.COMMAND {>|>>} /PATH/TO/SOMEFILLE 2>&1
2.&>,&>>
特殊的裝置檔案:
/dev/null:blackhole(黑洞),blackbucket(位桶); 輸出
/dev/zero:泡泡機,吐零機; 輸入
bash中的其他特殊符号:
<<:here document,此處文檔,結束标記;(跟輸入重定向沒有任何關系)
<<<:here string,此處字元串,結束标記;
bc指令為電腦,在這裡<<<把後面的79/8整合為字元串送到前面的bc去執行。
十二、bash變量
變量:一段有名稱的連續的記憶體空間;
變量名:這段記憶體空間的名稱,稱為變量名;
變量值:在這段記憶體空間中存儲的資料,則稱為變量值;
向記憶體空間(變量)中存儲資料的過程,稱為指派操作;指派符号通常為"=";
變量的類型:
123 -- 整型:01111011
-- 字元型:ASCII:3位元組
-- 字元型:UTF-8:9位元組
(變量類型不一樣,占據的記憶體空間也不一樣)
變量分為:
強變量:使用之前必須事先聲明,必須聲明變量類型;
弱變量:在使用之前無需聲明,無需指明變量類型;(bash變量)
變量的指派方法:
VARNAME=VALUE
含義:将某數值(VALUE)通過指派操作(=)存儲于特定的記憶體空間中(VARNAME);
bash中變量名稱的命名規範:
1.變量名隻能以"_"或"字母"為起始字元,後面的其他字元可以是任意字母,數字或下劃 線;
2.變量名中的字母大小寫敏感;
3.命名的書寫格式:
全大寫:HISTSIZE
全小寫:myvar
駝峰式:MyNewVariable
連接配接式:My_New_Var
4.變量名要能做到見名知意;
5.變量名不能與已知變量或bash的内置變量重複;
bash中的變量的分類:
根據變量的作用範圍來劃分:
全局變量(環境變量):作用範圍為整個shell程序,包括其子shell;
本地變量:作用範圍為目前登入時打開的shell程序,不包括其子shell;
局部變量:作用範圍僅僅隻是目前程式段,一般用于函數;
根據變量的聲明方式來劃分:
bash内置變量:
普通的内置變量:HISTSIZE,...
位置參數變量:$0, $1, $2, ...
touch存儲的位置就是$0 $1 $2 $3 $4
特殊變量:$?, $#, $*, $@, $$, ...
$?:展開為最近一次執行的指令的狀态傳回值(退出狀态碼);用以表示最近一 次執行的指令是否成功執行;
$#:不包括$0在内的其餘的位置參數的個數,以十進制數字表示;
$*:從$1開始展開為位置參數。當使用雙引号引用展開的結果時,它展開為 特殊變量IFS的第一個字元分隔的值;
$@:從$1開始展開為位置參數。當使用雙引号引用展開的結果時,它展開為 一個單獨的字元串;
$$:展開為目前shell的程序辨別符;
自定義變量:使用者可以自定義的變量;
變量的使用:
1.變量的聲明(所有聲明的變量都是自定義變量)和指派:
1) 聲明全局變量(環境變量):
export:
export VARNAME
export VARNAME=VALUE
可以聲明,也可以直接聲明後進行指派操作,如下圖:
declare指令:
declare - Set variable values and attributes.
格式:declare [-aAfFgilrtux] [-p] [name[=value] ...]
常用的選項:
-a:聲明索引數組(如果支援)
-A:聲明關聯數組(如果支援)
-i:聲明整型變量
-l:聲明變量并将變量值中的字母轉換為小寫字母
;
-u:聲明變量并将變量值中的字母轉換為大寫字母;
-r:聲明隻讀變量;該變量僅能進行一次指派操作;
-x:聲明變量并将其導出為全局變量;
聲明為全局變量:
declare -x VARNAME[=VALUE]
聲明全局變量後,變量就可以在目前shell及其子程序的shell中使用;
2) 聲明本地變量:
VARNAME=VALUE
本地變量直接聲明,聲明後的變量隻可以在目前的shell中使用,作用範圍
隻在目前shell中;
3) 聲明局部變量:
local VARNAME[=VALUE]
僅僅是在函數中使用的變量;
2.檢視環境變量:
set指令:檢視和改變shell屬性的值及檢視shell變量的變量名和變量值;
export指令:檢視變量名稱,也可以為變量指派;
env指令:與export指令類似;
3.檢視變量的值:
echo ${VARNAME}
4.撤銷變量的指派及變量聲明
unset VARNAME
有關于儲存變量的shell配置檔案:
通用配置檔案(在系統啟動的時候就已經加載好的配置檔案):
/etc/bashrc
/etc/profile
/etc/profile.d/*
私人配置檔案(在家目錄下的隐藏檔案中,隻有此使用者登入後才會加載的配置檔案):
~/.bashrc
~/.bash_profile
注意:
1.一般情況下,變量都是随用随聲明,除非有必要,否則不建議修改配置檔案的内容;
2.聲明的變量在使用完以後,最好使用unset指令予以撤銷;