Shell
Shell簡介
Shell:指令行解釋器,是使用者與系統溝通時的媒介。Linux采用bash為其預設shell系統可以使用的shell記錄在/etc/shells
Bash:Bourne-again Shell的縮寫。GNU計劃的一個元件。與Unix上的Bourne Shell完全相容。紅帽企業版linux預設的Shell是Bash.
Bash的特點:
①支援指令行輸入、操作曆史查詢、快捷鍵、使用變量等功能。
②支援通配符、别名、串操作、檔案測試、整形算數運算等功能。
③Bash可以互動使用,或者作為一種強大的腳本語言來使用超過60個的shell變量。
Bash快捷鍵
Ctrl + d:輸入已結束 在shell下相當于一個exit
Ctrl + c:鍵盤中斷請求
Crtl + z:挂起
Ctrl + s & Ctrl + q:暫停/恢複螢幕輸出
Ctrl + l:清屏 相當于clear
Tab:自動補完指令行與檔案名 列出所有可能的選擇
Ctrl + a:光标移到行首
Ctrl + e:光标移到行尾
Ctrl + k:從光标所在處删除到行結尾
Ctrl + u:删除整行
Esc + f:光标移到下一個單詞的開始處
Esc + b:光标移到前一個或目前單詞的開始處
Bash的限制
①資源型敏感,對CPU負擔重的程式
②複雜的大項目
③需要靈活處理檔案的程式(逐行)
④需要圖形使用者界面的程式需要直接與系統硬體打交道的程式
⑤需要通路I/O端口和網絡套接字的程式
⑥需要使用庫或和以前的其他代碼整合的程式
Bash的如何處理指令
Bash指令的優先級
上面提到了一個指令的優先級,一共有那幾種“指令”?
alias cp vm rm
keyword if while until case for
functions 函數
builtin #man alias
$PATH #echo $PATH
Bash的操作環境
Bash 4個主要環境設定檔案
全局設定檔案:
/etc/profile
/etc/bashrc
使用者設定檔案:
~/.bashrc
~/.bash_profile
Bash其他設定檔案
~/.bash_logout
~/.bash_history
/etc/profile.d/*.sh
set
Bash還有一些與操作接口有關的變量,以及使用者自定義變量的存在。set指令還會将其他bash内的變量全部顯示出來。
stty
設定tty終端,控制backspace是删除等功能
終端環境 - set選項
-f 使路徑名替換(比對)無效
-n 讀取指令,但不執行(用來對腳本進行文法檢查)
-o optionname 設定指定的選項,一些常用的選項如下:
emacs
使用emacs風格的指令行快捷鍵
ignoreeof
當EOF(Ctrl+D)被讀取時,不退出shell。
vi
使用vi風格的指令行快捷鍵
-v 在指令被讀取時列印指令(調試腳本時有用)
-x 在替換被應用之後列印指令(調試腳本和檢查shell替換時有用)
-C 不允許shell在重定向中損壞檔案。
PS1指令提示符:
\d 可顯示出[星期 月 日]的日期格式,如:“Mon Feb 2”。
\H 完整的主機名。
\h 主機名在第一個小數點前的名字,如www後面省略。
\t 顯示時間,為 24 小時格式的[HH:MM:SS]。
\T 顯示時間,為 12 小時格式的[HH:MM:SS]。
\A 顯示時間,為 24 小時格式的[HH:MM]。
\@ 顯示時間,為 12 小時格式的[am/pm]樣式 。
\u 目前使用者的賬号名稱,如root。
\v BASH的版本資訊。
\w 完整的工作目錄名稱,由根目錄寫起的目錄名稱,家目錄
會以~ 替代。
\W 調用basename函數的工作目錄名稱,是以僅會列出最後
一個目錄名。
\# 下達第幾個指令。
\$ 提示字元。root時是#,否則就是$。
Bash的啟動
Shell的自動啟動
無論何時登入或者打開終端,shell都會自動啟動
Bash - export
export 變量名 自定義變量轉換成環境變量
export 檢視環境變量
Bash - history
1、在bash中輸入history指令可以查詢使用者的過往操作。
2、history記錄在記憶體中而定。
3、history表在使用者logout時會記錄入使用者主目錄下的.bash_history檔案中,在下次login時載入。
如何使用history?
使用 ! 來調用曆史指令
!!:重複執行上一條指令
!ex:重複執行上一條以ex為開頭的指令
!N:重複執行上一條在history表中記錄号碼為N的指令
!-N:重複執行前面第N條指令
Bash - alias
在shell下鍵入alias可以查詢目前alias清單。
使用者可以alias來為一條指令取一個簡單的别名
使用者也可以用unalias來取消一條别名記錄。
alias記錄在shell中總是先執行。
Bash歡迎資訊
進入系統時的:/etc/motd
#echo 'Welcome!' > /etc/motd
登入系統是的:/etc/issue
/etc/issue.net
#cat /etc/issue
RHEL5.8 (magedu) \m
Date:\d \t
terminal:\l
特殊字元的含義:
\d 本地日期
\m 硬體等級
\o 域名
\t 本地時間
\v 作業系統版本
\l 終端号
\n 網絡名
\r 作業系統版本
\s 作業系統名稱
輸入輸出、重定向
基于終端的程式往往從一個源讀取資訊,像一個目的地寫入資訊。
程式讀取的源被稱為标準輸入 – stdin。
程式寫入目的地被稱為标準輸出 – stdout。
程式通常把錯誤狀況報告給标準錯誤 – stderr。
stdin:鍵盤。
stdout、stderr:終端、顯示器
通常情況下,标準錯誤與終端的顯示器相連,錯誤資訊與标準輸出混合在一起。
Bash可以用>或>>重定向标準輸出,用<重定向标準輸入。
将輸出寫入檔案
用 > 把程序的标準輸出流重定向到檔案中。
将輸出追加到檔案
用 >>把指令輸出附加到檔案中
将輸入源改變成别的地方
用 <把指令輸輸入方式改變成别的
把輸入輸出和重定向混合使用。
2>把标準錯誤流重定向到檔案中。
2>&1或>&把标準錯誤流與标準輸出流結合在一起。
2>&1的意思是,“把标準錯誤傳送到标準輸出要去的任何位置”。
用來重定向标準輸入、标準輸出和标準錯誤的總結
cmd < file 從file重定向标準輸入
cmd > file 把标準輸出重定向到file中,如果file存在的話,覆寫(損壞)它
cmd >> file 把标準輸出重定向到file中,如果file存在,附加給它
cmd 2>file 把标準錯誤重定向到file,如果file 存在,覆寫(損壞)它
cmd 2>> file 把标準錯誤重定向到file中,如果file 存在,附加給他
cmd >file 2>&1 合并标準輸出和标準錯誤,并且重定向到file中(可移植的文法)
cmd >& file 合并标準輸出和标準錯誤,并且重定向到file中(友善的文法)
分割與管道
分割:
讓使用者在一個指令行中輸入多個指令。通過使用“;”隔開指令。
适合把多個小指令連起來。
所謂的“管道”可以把一個程序的标準輸出流與另一個程序的标準輸入流連接配接起來。
bash用“|”在兩個指令之間建立管道。
一個指令的輸出(标準輸出)被直接“用管道輸送”到另一個指令的輸入(标準輸入)中,進而構成了 Linux所謂的管道(pipe)。
常和管道協作的指令
more/less
find
xargs
grep
sort
uniq
- more/less
常和管道協作的指令 - find
find指令選項
-name 按照檔案名查找檔案
-perm 按照權限查找檔案
-user/-group 按照使用者/組查找檔案
-mtime 按照修改時間查找檔案
-type 按照類型查找檔案
-a/-o 與and/或or
-depth 先查目前目錄再查子目錄
常和管道協作的指令 – grep
grep指令用于搜尋pattern參數指定的内容,并将比對的行寫入标準輸出。
還有egrep和fgrep兩個指令。
egrep可以使用擴充的正規表達式
fgrep沒有元字元與普通字元的差別
grep egrep用别名加了--color之後才好了解。
grep, egrep, fgrep - print lines matching a pattern
-r 遞歸
-v 反取
-i 忽略大小寫
-n 顯示行号
-c 計數
-w 比對一個詞
-l 隻給出比對的檔案名
-L 列出不比對的檔案名
-o 隻列出比對的内容
grep中使用 - POSIX字元類
[:alnum:]文字數字字元 [:alpha:]文字字元
[:digit:]數字字元 [:upper:]大寫字元
[:lower:]小寫字元 [:cntrl:]控制字元
[:punct:]标點符号 [:print:]非空字元(包括空格)
[:space:]所有空白字元(新行,空格,制表符)
[:graph:]非空字元(非空格、控制字元)
[:xdigit:]十六進制數字(0-9,a-f,A-F)
常和管道協作的指令 - sort
sort - sort lines of text files
-n 按數字排序
-r 反序排序
-o 結果輸出到檔案
-t 分隔符
-k 關鍵字
常和管道協作的指令 - uniq
uniq - report or omit repeated lines
-c 每行出現的次數
-d 僅顯示重複行
-u 僅顯示不重複行
-f N 跳過前面N個部分
-s N 跳過前面N個字元
子shell與&& ||
&&和||是shell script中的判斷,常在安裝軟體和判斷輸入時使用。
&&的含義:邏輯與。左邊的指令執行成功傳回真(0)後,右邊的指令才能被執行。
||的含義:邏輯或。左邊的指令執行失敗傳回假(1)後,右邊的指令才能被執行。
什麼是Shell scripts
Shell scripts就是字面上的意思shell +script,就是對shell寫的腳本。
腳本是介于程式設計語言與指令之間的,形式上和功能上更進階前者,但是并不是使用者程式開發,也沒有嚴格複雜的文法規則,無需編譯。
這個程式是純文字檔案的,将一些shell的文法和指令(包括外包指令)寫在裡面,搭配正規表達式、管道或别的功能實作我們想要的處理目的。
關于檔案類型的判斷,如:test -e filename
-e 是否存在
-f 是否為檔案
-d 是否為目錄
-b 是否為block device
-c 是否為character device
-S 是否為socket檔案
-p 是否為pipe檔案
-L 是否為連接配接
關于檔案權限的判斷,如:test -r filename
-r 檔案是否可讀
-w 檔案是否可寫
-x 檔案是否可執行
-u 檔案是否有SUID
-g 檔案是否有SGID
-k 檔案是否有Sticky bit
-s 檔案是否非空
兩個檔案之間的比較,如:test file1 -nt file2
-nt file1是否比file2新
-ot file1是否比file2舊
-ef file1是否和file2是同一個檔案
兩個整數之間的判斷,如:test n1 -eq n2
-eq 兩個數相等
-ne 兩個數不等
-gt n1大于n2
-lt n1小于n2
-ge n1大于等于n2
-le n1小于等于n2
判斷字元串資料
est -z string 字元串是否為0 為空傳回true
test -n string 字元串是否非0 為空傳回false
test str1 = str2 str1是否等于str2 相等傳回true
test str1 != str2 str1是否不等于str2 相等傳回false
其他判斷,如:test -r filename -a -x filename
-a 兩個狀況同時成立 and與
-o 兩個狀況任何一個成立 or或
! 反
條件測試、循環分支
if條件語句,格式 if [ condition ]
then
command
fi
if [ condition ];then
command1
else
command2
if [ condition1 ];then
elif [ condition2 ];then
command3
for循環
格式:for NAME in [ LIST ]; do COMMANDS;
done
LIST用法
直接寫 例如:1 2 3
大括号 例如:{1..5}
檔案名 例如:/etc/*.conf
指令結果 例如:find /etc/ -name “*.conf”
C語言風格 例如:for (( i=0;i<=5 i=i+2 ))
i++也可以
while循環
格式:while CONTROL-COMMAND; do
CONSEQUENT-COMMANDS; done
例子:檢查程序是否在運作
until循環
格式:until TEST-COMMAND; do
CONSEQUENT-COMMANDS; done
case
格式:case EXPRESSION in
CASE1) COMMAND-
LIST;; CASE2) COMMAND-LIST;;
... CASEN)
COMMAND-LIST;;
esac
正規表達式
概念
正規表達式是指用來描述或者比對一系列符合某個句法規則的字元串的單個字元串。就是用某種模式去比對一類字元串的一個公式。
基本元字元集
.點 比對任意單個字元。如:rat、rut、r t。
^ 比對一行的開始。
$ 比對一行的結尾。
* 比對0個或多個*前面的字元。
+ 比對1個或多個+前面的字元。
? 比對0個或1個?之前的字元。
\ 轉義
[] 比對括号中的任何一個字元。如:[abd]、[0-9]。
[^] 比對不在括号中的,表示排除。如:[^abd]。
\< 比對詞的開始。
\> 比對次的結尾。如:\<the\>。
() 分組。将比對這個表達式的字元儲存到一個臨時區域
(最多儲存9個),它們可以用\1到\9來引用。
| 或。例如:(him|her)。
{m} 前面的表達式重複m次。如:"\w{2}"相當于 "\w\w"。
{m,n} 表達式至少重複m次,做多重複n次。如:"ba{1,3}"比對"ba"或"baa"或"baaa"。
{m,} 表達式至少重複m次。
\w 任意一個字母或數字或下劃線。
\d 任意一個數字。
\s 空格、制表符、換頁符、空白符中的任意一個。
正規表達式文法支援
指令或
環境 . [] ^ $ \( \) \{ \} ? + | ()
vi X X X X X
awk X X X X X X X X
sed X X X X X X
grep X X X X X X
egrep X X X X X X X X X
perl X X X X X X X X X
sed
sed是stream editor的縮寫。是一個非互動式上下文編輯器。sed預設不對檔案做操作隻輸出而已。
使用情況:
編輯對互動式編輯器而言太大的檔案。在編輯指令太複雜而難于在互動模式下操作的檔案。
sed工作模式
sed編輯器逐行處理檔案(或輸入),并将輸出結果發送到螢幕。sed把目前正在處理的行儲存在一個臨時緩沖區中,這個緩沖區稱為模式空間或臨時緩沖。Sed處理完模式空間中的行後(即在該行上執行完sed指令後),就把該行發送到螢幕上(除非之前又指令删除這一行或取消列印操作)。sed每處理完一行就将其從模式空間中删除,然後将下一行讀入空間,進行處理和顯示。處理完輸入檔案的最後一行後,sed便結束運作。sed把每一行都存在臨時緩沖區中,對這個副本進行編輯,是以不會修改或破壞源檔案。
文法:
sed [options] '{command}' [filename]
sed中的正則
^ 行的開始
$ 行的結尾
. 一個字元
* 0個或多個前一個字元
[] 方括号中的所有字元
{} 重複次數
() 組
/./ 比對至少有一個字元的行
/../ 比對至少有兩個字元的行
/^#/ 比對用#開頭的行
/^$/ 比對空行
/}$/ 比對用}結尾的行(沒有空格在後面)
/} *$/ 比對用}結尾的行(可以有空格在後面)
/[abc]/ 比對小寫的a或b或c
/^[^abc]/ 比對開頭不是小寫的a或b或c
awk
awk是一種有力的文本處理工具。是各種現有環境中功能最強大的資料處理引擎之一。
awk的文法與調用方式:
指令方式
awk ‘PATTERN{ACTION}' file
print $1
如-F: awk -F: '{print $1,$3}' file
本文轉自 陳延宗 51CTO部落格,原文連結:http://blog.51cto.com/407711169/1168106,如需轉載請自行聯系原作者