一、Bash是什麼?
bash 是一個爲GNU計劃編寫的Unix shell。它的名字是一系列縮寫:Bourne-Again SHell — 這是關於Bourne shell(sh)的一個雙關語(Bourne again / born again)。Bourne shell是一個早期的重要shell,由史蒂夫·伯恩在1978年前後編寫,並同Version 7 Unix一起發佈。bash則在1987年由布萊恩·福克斯創造。
Bash(GNU Bourne-Again Shell)是許多Linux平臺的內定Shell,事實上,還有許多傳統UNIX上用的Shell,像tcsh、csh、ash、bsh、ksh等等,Shell Script大致都類同,當您學會一種Shell以後,其它的Shell會很快就上手,大多數的時候,一個Shell Script通常可以在很多種Shell上使用。
bash是大多數Linux系統以及Mac OS X v10.4默認的shell,它能運行於大多數Unix風格的操作系統之上,甚至被移植到了Microsoft Windows上的Cygwin系統中,以實現windows的POSIX虛擬接口。此外,它也被DJGPP項目移植到了MS-DOS上。
bash的命令語法是Bourne shell命令語法的超集。數量龐大的Bourne shell腳本大多不經修改即可以在bash中執行,只用了Bourne特殊變量或使用了Bourne的內置命令的腳本才需要修改。 bash的命令語法很多來自Korn shell (ksh) 和 C shell (csh), 例如命令行編輯,命令歷史,目錄棧,$RANDOM 和 $PPID 變量,以及POSIX的命令置換語法: $(...)。作爲一個交互式的shell,按下TAB鍵即可自動補全已部分輸入的程序名,文件名,變量名等等。
二、Bash特性介紹。
1、命令歷史。
1)環境變量:$HISTSIZE,設置命令的歷史保存最大條數
$HISTFILE,用戶退出時的持久保存位置,通常爲用戶家目錄下的.bash_history
$HISTFILESIZE,命令保存文件中可保存的命令最大條數
$HISTCONTROL,命令歷史保存規則: ignoredups,忽略重複的命令,連續相同的命令才能匹配
ignorespace,忽略以空白字符打頭的命令
ignoreboth,以上二者同時生效
2)命令用法。
history N:顯示最近的N條,包括當前命令本身
history -c:清空命令歷史
history -d offset:刪除指定的偏移處的命令條目
history -a [/path/to/file]:將當前會話的命令歷史寫入指定文件
3)調用命令歷史。
!#:執行命令歷史的第#條命令
!!:執行上一條歷史命令
!string:執行命令歷史由最後一次以string開頭的命令
!$:調用上一條命令的最後一個參數
"ESC",".":先按ESC再按"." 功能同上
2、命令補全,
路徑補全:每個絕對路徑都可以切割爲兩部分,basename(基名)、dirname(目錄名)
3、狀態返回值:每個命令執行結束後,會有一個執行狀態返回值,有效範圍0-255,0表示執行成功,1-255表示執行失敗,使用特殊變量"$?"可獲取最近一條命令的狀態返回值, #echo $?
4、命令行展開:~表示用戶家目錄,~USERNAME指定用戶的家目錄
{}:/tmp/{x,y}展開爲 /tmp/x,/tmp/y
5、命令別名和命令引用:通過命令alias定義命令別名
定義命令別名:alias grep="grep --color"
撤銷別名:unalias grep,unalias -a撤銷所有別名
6、bash支持的引用:
''
""
``:引用一個命令的執行結果,$()也是一樣
7、文件名通配:
*:任意長度的任意字符 ?:匹配任意單字符 []:匹配指定範圍內的任意單字符 [abc],[a-z],[0-9],[0-9a-z] [^]:匹配指定範圍以外的任意單字符 [^0-9a-z] [:space:] 所有空白字符 [:punct:] 所有標點符號 [:lower:] 所有小寫字母 [:upper:] 所有大寫字母 [:digit:] 所有數字 [:alnum:] 所有字符集合 [:alpha:] 所有字母集合
8、輸入、輸出重定向和管道
標準輸入:0 標準輸出:1 錯誤輸出:2 重定向:改變其標準位置 輸出重定向:COMMAND > POSITION 錯誤重定向:COMMAND 2> POSITION 合併重定向:COMMAND > POSITION 2>&1 分別重定向:COMMAND > POSITION 2> POSITION2 輸入重定向:COMMAND < POSITION
9、快捷鍵
Ctrl+a:跳轉至命令行首
Ctrl+e:跳轉至命令行尾
Ctrl+u:刪除命令行首至當前光標所在處之前的所有內容
Ctrl+k:刪除當前光標所在處至命令行尾的所有內容
Ctrl+l:清屏,類似clear命令
Ctrl+z:把當前命令送至後臺執行
10、變量
1)bash變量類別 本地變量:只對當前shell進程有效,對其他shell進程無效,包括當前進程的子進程 變量賦值:VAR_NAME=VALUE 環境變量:對當前shell進程及其子shell有效,對其他的shell進程無效 變量賦值:export VAR_NAME=VALUE 撤銷變量:unset VAR_NAME 只讀變量:readonly VAR_NAME 局部變量:對shell腳本中某代碼片段有效,通常用於函數本地 變量賦值:local VAR_NAME=VALUE 位置變量:對命令參數生效 如:$1指參數1,$2指參數2 特殊變量:例如$?,顯示狀態返回值 $RANDOM 顯示隨機數字 2)變量命名 1、不能使用程序中的關鍵字;如:if,case,for 2、只能使用數字、字母和下劃線,且不能以數字開頭 3、命名要規範,見名知義 3)變量類型 數值型,字符型,布爾型 類型轉換
11、bash的配置文件
profile類:爲交互式登錄的用戶提供配置 全局:/etc/profile /etc/profile.d/*.sh 用戶:~/.bash_profile 功用:設定環境變量,運行命令或腳本 bashrc類:爲非交互式的用戶提供配置 全局:/etc/bashrc 用戶:~/.bashrc 功用:設定本地變量,定義命令別名 登錄類型:交互式,直接通過終端輸入帳號和密碼登錄,su - username 非交互式,圖形界面下打開的終端、執行腳本、su username 交互登錄的用戶:/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc 非交互登錄的用戶:~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh