運維學習第四彈之shell(bash):linux
1、git
hell能夠翻譯成殼,大多指可以對內部核心起到保護做用的一種裝置或結構。在計算機科學中shell的實際意義爲操做者提供的、可以經過系統調用或庫調用使用整個計算機資源的訪問接口。shell
它既是一種命令解析器又是一種程序設計語言。做爲命令解析器,它能夠解釋和執行用戶輸入的命令,也能夠自動地解釋和執行預先編寫好並保存在某個文本文件中的一系列的命令;做爲程序設計語言,shell特別定義了各類變量和參數,並提供了許多在高級語言中才具備的控制結構,包括循環和條件分支,讓咱們能夠像使用高級語言那樣去使用shell,使之可以勝任複雜邏輯環境的應用,提升其執行效率,更容易發揮其自動化的特性緩存
shell分爲交互式shell和非交互式shell:安全
1)交互式shell:在這種模式下,shell等待你的輸入,而且執行你提交的命令。這種模式被稱做交互式是由於shell與用戶進行交互。這種模式也是大多數用戶很是熟悉的:登陸、執行一些命令、註銷登陸。當你註銷登陸後,shell將終止運行。bash
2)非交互式shell;在這種模式下,shell等待你的輸入,而且執行你提交的命令。這種模式被稱做交互式是由於shell與用戶進行交互。這種模式也是大多數用戶很是熟悉的:登陸、執行一些命令、註銷登陸。當你註銷登陸後,shell將終止運行。運維
這裏咱們可使用cat /etc/shells來查看shell的類型。ide
這裏咱們終點學習基本的shell ——bash學習
bash:bash是大多數Linux系統以及Mac OS X默認的shell,它能運行於大多數Unix類操做系統之上,甚至被移植到了Microsoft Windows上的Cygwin系統中,以實現Windows的POSIX虛擬接口。spa
2、bash命令:
1)、alias命令:命令的別名,用於自定義命令
例、alias mp=‘mkdir -pv’
撤銷別名:unalias unaliasNAME
注意:
1.alias命令的效郭僅限於當前shell的生命週期
2.若是修改.bashrc配置文件,其中保存的別名並不會當即生效,只有從新加載該文件的內容以後, 纔會生效,且永久生效。
3.爲了可以保證咱們設置的別名有效,一般兩種操做都要作
另外,對於每個用戶來講,都有一個私有的bash配置文件,用於保存別名 ~/.bashrc
2)歷史命令:
BASH進程會幫助用戶保存曾經執行的命令,以方便用戶重複執行某個命令;
經過bash提供的歷史命令文件來保持此前執行過的命令,每一個用戶都有其本身私有的歷史文件
登陸shell的時候,BASH會自動讀取~/.bash_history文件中的所記錄的全部命令;
history命令:
-c清空歷史緩衝區中的歷史命令
-d 偏移量從指定位置刪除歷史列表。
-a將當前繪畫的歷史行追加到歷史文件中
-n從歷史文件中讀取全部未被讀取的行
-r讀取歷史文件並將內容追加到歷史列表中
-w將當前歷史寫入到歷史文件中,並追加到歷史列表中
-p對每個 ARG 參數展開歷史並顯示結guo而不存儲到歷史列表中
-s以單條記錄追加 ARG 到歷史列表中
重複執行前一個命令的方法:
1使用箭頭
2.ctrl+p
3.!-1
4.!!
重複執行歷史緩衝區中的命令:
! #:重複執行編號爲#的命令
! 字符串:查找第一個以字符串開頭的並重復執行
!?+字符串:從歷史緩衝區中查找最近一次包含字符的命令並重復執行
!-#:執行歷史緩衝區中倒數第#條命令
ctrl+r:在歷史緩衝區中實施搜素,回車執行便可
重複使用歷史命令中的一部分;
!$:表示最後一個命令中的最後一個參數;
esc, .
Alt+.:
!^:上一個命令中的第一個位置的參數
!:2:上一個命令中的第2個未位置的參數
!SEQUENCE;#:表示
與歷史相關的bash變量:
HISTSIze: 2
HISTSIESIZE:
HISTTIMEFORMAT
HISTCONTROL:什麼命令記錄什麼不記錄
清空歷史命令:
ignoredups:忽略連續且相同的命令的歷史緩存:
ignorespace:忽略以空白字符開頭的命令;
ignoreboth:以上兩個功能都啓用;
history 命令在bash中是一項很重要的命令,對於初學者來講,對於命令的基本操做還不是很容易,這個命令能夠很好的幫助咱們查看並重復之前的操做。
3、快捷鍵:鍵盤映射
c-->ctrl
M-->Alt
E-->ESC
DEL-->Backspace
c-l:clear,清屏
C-a:將光標移至命令的行首
c-e:將光標跳轉至命令的行尾
c-k:刪除光標所在位置到行尾的命令行信息
c-u:刪除光標所在位置到行首的命令行信息
C-c:取消當前命令的進程
4、命令補全機制:
命令自己字符串的補全
參數的補全
shell命令的執行過程:
1.shell會根據用戶輸入的「ENTER」來判斷用戶的輸入結束
2.shell會將收集的命令信息,根據空白字符來分段,第一個分段被理解爲命令字段
3.判斷第一個字段是內部命令仍是外部命令,若是是內部,則直接運行;若是是外部,經過PATH標量所指示的路徑信息嗎,去查找相關的位置以肯定是否存在同名文件,若是有執行;不然報錯
4.判斷選項是否正確,判斷參數是否正確;
使用TAB鍵完成命令補全:
榮國給出的字符串不能做爲惟一標識,則bash不予補全;再次敲擊tab鍵,bash會給出參數列表。;若是參數列表中的內容過多,bash會查詢是否顯示該列表
根據提供的參數來進行補全,若是參數沒有任何提示信息則默認從工做目錄進行查找
5、命令行的展開:
~:bash會自動將其展開爲當前登陸用戶的家目錄:
~STRING:bash會自動將其展開爲「STRING」爲用戶名的用戶的家目錄;
~+:調用shell變量「PWD」的值
~+:調用shell變量「OLDPWD"的值;
{}:在花括號中能夠填充一個以」,「分隔的路徑列表,bash會將其展開爲多個獨立的路徑;相似於乘法結合律
例如:mkdir -pv /tmp/{a,b}_{c,d}
wc命令:wc命令用來打印文件的文本行數、單詞數、字節數等
-c:只顯示字節數
-l:只顯示行數
-w:只顯示字數
6、命令的執行結果
任何一個linux命令都有兩個執行結果:
其一:命令的正常輸出結果;
根用戶需求相關的返回內容
``:反向單引號,反引號echo "I am `whoami`"
I am root
$():標準的命令引用格式
其二:命令的執行狀態返回值:
跟命令執行成功與否相關的返回內容
保存在bash的一個特殊變量中;$?
0:表示命令執行成功
1,2,127:表示內置狀態返回值
1:表示小問題
2:嚴重問題
127:命令自己出問題
3-126,128-255:用戶自定義狀態信息;
引用功能:
‘’:強引用
凡是被單引號引用的內容,bash一概將其視爲普通字符,即便其自己有特殊功能和做用也是如此,但單引號自己是個例外。
"":弱引用
被雙引號引用的內容中,有些特殊字符仍然會保留其特殊含義,參數自己須要空格,最好加引號
例如:
[root@localhost ~]# echo "I am `whoami`"
I am root
[root@localhost ~]# echo '$PATH'
$PATH
[root@localhost ~]# echo "$PATH"
usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# date
2017年 03月 19日 星期日 10:59:48 CST
[root@localhost ~]# date +%F %T
date: 額外的操做數 "%T"
Try 'date --help' for more information.
[root@localhost ~]# date +"%F %T"
2017-03-19 11:00:21
轉義功能:
\:bash中定義的轉義字符;只能使其其後的一個字符有做用,使其後的字符失去做用,或者實現自己的意義
9、Globbing,文件名統配,簡稱爲glob;
元字符:通配符
*:匹配任意長度的任意字符,某些特殊位置的「.」不能被匹配
?:匹配任意單個字符,
[]:匹配指定範圍內的任意單個字符,必須且只有一個字符被匹配;
字符集:
[:lower:]:全部的小寫字母
[:lower:]]:全部小寫的單個字符
[:upper:]:全部的大寫字母
[[:alpha:]]:全部的字母字符
[:digit:]:表示全部的十進制數字
[:alnum:]:表示全部的大小寫字母以及十進制數字
[:space:]:表示全部的空白字符
[:punct:]:全部的標點符號
^:取反匹配
例:ls -d /etc/[^[:alpha:]][[:alpha:]]*
目錄下,以非字母開頭,且其後跟了 一個字母以及其餘任意字符的文件名
10、
輸入輸出重定向
在使用計算機時實現某種x功能的主題是:程序:指令+數據
數據:文件,IO
能夠用於輸出的設備:文件
鍵盤設備,文件系統中的常規文件,網卡設備,聲卡設備;
能夠用於輸出的設備:文件
顯示器,文件系統中的常規文件,網卡設備、聲卡設備;
每一種程序都有三種數據流:
輸入數據流:爲程序 獲取數據的數據流;默認的輸入數據流來源就是鍵盤;
輸出數據流:將程序所處理的數據結果展現給用戶的數據流;默認的終點是顯示器
錯誤數據流;將程序沒法處理或處理過程當中出現問題的結果展現給用戶的數據流;
默認的錯誤數據流的終點是顯示器;
從鍵盤實現的輸入數據流稱爲標準輸入
從顯示器上的輸出數據流稱爲標準輸出
到顯示器上的錯誤數據流稱爲標準錯誤輸出,簡稱標準錯誤
文件描述符:File Descriptor,FD 爲何?
十六位二進制
0:標準輸入,stdin
1:標準輸出,stdout
2:標準錯誤,stderr
IO重定向:採用非標準設備文件實現的IO操做;
輸出重定向:
ls > /tmp/ls.out 人爲地將ls命令顯示到目標文件中
cat /tmp/ls.out 顯示文件輸出
>:覆蓋(替換)輸出重定向:將源文件內的內容所有替換。
~]# set -C //開啓防誤覆蓋開關
在開啓次開關後,可使用「>|」符號繼續覆蓋重定向
例:ifconfig >| /tmp/ifconfig.out 能夠在開關開啓的狀況下實施文件的覆蓋。
~]# set +C //關閉防誤覆蓋開關
>>:追加輸出重定向:在原有的文件內容下追加信息。
能夠用輸出重定向建立一個新的文件:例:> nullfile ,>> nullfile
可是對於新的不存在的文件來講 >,>> 是同樣的,可是對於之前不存在的文件來講是不同的,在操做是必定要注意安全。
錯誤重定向:
2(標準錯誤) >:覆蓋錯誤重定向
例:lss 2> /tmp/lss.out 將原來要輸出到2中的錯誤數據流信息重定向到指定文件內
2 >>:追加錯誤重定向
合併標準輸入和標準輸出的重定向
1) &>:覆蓋
&>>追加
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
輸入重定向:
<:惟一的輸入重定向符號
有的命令是不支持文件作參數的:tr
tr ‘abc’'ABC' < /etc/issue
wc:命令加<(純數字的結果)與不加<是兩種結果
<<:是無心義的符號 但對shell來講有用。Here Document()此處文檔
例 wc << /etc/inittab
cat > /tmp/cat.out << EOF(至此字符結束執行命令)用來文件的建立而且編輯內容。
<<<:此處字符串eof
例:tr 'a-z''A-Z' <<< eof
/ETC/FSTAB
tr 'a-z''A-Z' << eof
hello
hi
i am so good
eof
HELLO
HI
I AM SO GOOD
11、管道:都是有標準輸出的命令
1:
COMMAND1|COMMAND2|COMMAND3|....
head -n 9 /etc/passwd | tail -n 1 (取出第九行)
注意:全部的用於管道鏈接的命令,都應該是可以有標準輸出數據流的命令;
tee: T
[root@localhost ~]# echo hahaha
hahaha
[root@localhost ~]# echo hahaha | tee /etc/passwd
hahaha
[root@localhost ~]# cat /etc/passwd
學好管道的運用,能夠大大的提升咱們早工做時的效率和效果。