Bash學習筆記
第1 頁 共28頁
Bash shell學習筆記 .........................................................................................................................2
1. 引言...................................................................................................................................2
2. Bash簡介..........................................................................................................................2
3. 啟動Bash..........................................................................................................................3
3.1Bash啟動選項 .............................................................................................................3
3.2交互式啟動 .................................................................................................................3
3.3非交互式啟動.............................................................................................................4
4. 注釋與幫助.......................................................................................................................5
5. 變量與數組.......................................................................................................................5
5.1變量分類.....................................................................................................................5
5.2變量的命名與賦值.....................................................................................................5
5.3 declare 選項................................................................................................................6
5.4 位置和特殊參量........................................................................................................6
5.5 環境變量....................................................................................................................7
5.6 數組..........................................................................................................................10
5.7 算術運算.................................................................................................................. 11
5.8字符串操作符...........................................................................................................12
6. 條件結構............................................................................................................................13
6.1 if語句.......................................................................................................................13
6.2 case語句...................................................................................................................15
6.2 select 語句.................................................................................................................15
6. 循環結構.........................................................................................................................16
7.1 for 命令 .....................................................................................................................16
7.2 while 命令.................................................................................................................16
7.3 until 命令..................................................................................................................17
7.4 循環控製命令..........................................................................................................17
7. 函數.................................................................................................................................17
8. 輸入輸出.................................................................................................................18
9.1 標準 I/O ..................................................................................................................18
9.2 重定向.....................................................................................................................19
9.3 Here 文檔................................................................................................................19
9.4 字符串 I/O(echo、printf 和 read 命令)...........................................................19
10作業控製............................................................................................................................20
11 命令曆史 ...........................................................................................................................21
12雜項....................................................................................................................................21
12.1 set命令和選項 .......................................................................................................21
12.2 shopt命令和選項 ...................................................................................................23
12.3 exec 命令 ................................................................................................................24
12.4 trap 命令.................................................................................................................24
13命令行處理過程 ...............................................................................................................25
13 Shell 腳本調試 ..................................................................................................................27
14對參考文獻的評論............................................................................................................28
15參考文獻............................................................................................................................28
www.linuxidc.com
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技術,最新IT資訊等Linux專業類網站。
Bash學習筆記
第2 頁 共28頁
1. 引言
Shell同時是一個命令解釋器和一門編程語言。作為命令解釋器(command interpreter),
shell 為用戶提供UNIX/Linux係統內核(kernel)的接口,使其能使用其多種工具集,而其編程
語言功能使得這些工具能夠連接起來。
UNIX/Linux shell有很多種,比如 Bourne shell(又稱AT&T shell, 標準的UNIX shell, sh)、
C shell(又稱 Berkeley shell)、Korn shell(Bourne shell 的擴展集,ksh) 、TC shell、Z shell 、Bash shell
等。 這些shell 的功能和使用都不盡相同。我們通常說 shell 編程,其實說精通所有 shell 編
程是很難的,一般也沒有必要。學習shell 編程最好選定一種 shell 來學習。而如此眾多的shell
選那一種比較好呢?筆者的意見是選擇 Bash,這不僅因為 Bash幾乎可以說是所有 shell 中
功能最豐富的,也符合 IEEE 1003.2 POSIX/ISO 9945.2 Shell 和工具部分規範,同時 Bash也
是Linux 上的默認 shell 。
由於shell 不僅僅是一門編程語言,學習 shell 的過程中除了要掌握其如何定義變量、使
用條件、循環等功能外,還應特別注意掌握如何通過各種方式配置其環境。
本文是Bash shell的總結學習筆記,總結過程中盡量注意寫明自己的心得、編程陷阱以
及經過很長時間才發覺的好用的功能等。
2. Bash 簡介
Bash是“Bourne-Again SHell”的縮寫,可以看成是 Bourne shell的升級版。它幾乎完全向
後與sh 兼容,融進了 Korn shell和C shell 的有用功能,同時也有自己的功能特征。Bash也
是旨在符合IEEE POSIX 規範(IEEE Standard 1003.1) 中IEEE POSIX Shell and Tools 部分的一
種shell ,是GNU係統的標準 shell 。Bash誕生於1988年1 月10星期天,最初由 Brian Fox
開發,目前由Chet Ramey 維護。
Bash相對sh 的特征主要有:
目錄處理,包含 pushd, popd 和dirs 命令
作業控製,包括 fg 和bg命令,以及使用 CRTL-Z停止作業
大括號擴展,可以產生任意的字符串
~ 擴展,指代用戶根目錄的縮寫
別名,讓你為命令或命令行定義縮寫名稱
命令曆史,讓你記得以前輸入的指令
以上源於C shell 。
命令行編輯,使用 emacs 或vi 風格
鍵盤綁定,讓你設置自定義編輯的鍵序列
集成編程特性,包含幾個 UNIX 外部命令的功能,包括 test 、expr 、getopt、echo
等,使得編程任務能更簡潔有效地完成
控製結構,特別是 select 結構,能簡單生成菜單
新的選項與變量,使得你有更多的途徑來定製你的環境
一維數組,使得引用與操作數據列表更為簡單
動態加載built-in 命令,自定義命令並加載進 shell 的功能。
www.linuxidc.com
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技術,最新IT資訊等Linux專業類網站。
Bash學習筆記
第3 頁 共28頁
3. 啟動Bash
3.1Bash 啟動選項
Bash可以帶以下選項啟動:
Bash選項 說 明
--login (-l) 使shell 表現得像通過登錄啟動的
--init-file filename
--rcfile filename
執行filename 中(代替~/.bashrc )命令啟動交互式 Bash
--noediting 不讀入GNU命令行編輯庫
--noprofile Bash作為登錄shell 啟動時不執行係統配置文件/etc/profile 或者
個人初始化文件~/.bash_profile,或~/.bash_login 或者 ~/.profile
--norc 在交互性shell 中不讀入~/.bashrc 文件。這一選項在 shell 是以sh
啟動時默認是開的
--restricted (-r) 以受限的shell 啟動
3.2 交互式啟動
交互式包括兩種方式:作為 login shell 或者 non-login shell。
交互式login 啟動時讀取以下係統級別和用戶級別的啟動文件;交互式 non-login 啟動時讀
取以下Bash級別啟動文件。
因此,Bash提供了三種級別的環境配置,分別與三種初始化文件對應:
(1 ) 係統級別,由/etc/profile 文件控製。這個文件在 Bash shell啟動時被執行。它可被
係統所有sh 和ksh 用戶使用。
(2 ) 用戶級別,由~/.bash_profile(或者~/.bash_login,或者~/.profile )和~/.bash_logout
文件控製。這些文件控製登錄用戶的基本登錄和退出環境。
(3 )Bash級別(子 shell 級別),由~/.bashrc 文件控製。每次一個新的 Bash shell啟動時
將自動執行~/.bashrc 文件,用來配置隻屬於 Bash shell的環境。~/.bashrc 一般會含
有以下語句:
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
/etc/bashrc 一般用來設置所有 Bash shell公用的變量
說明:
係統配置文件/etc/profile 文件中一般有如下語句:
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
. $i
fi
done
所以係統會在初始化時運行/etc/profile.d/ 目錄下的所有可讀.sh 腳本。
用戶級別的三個登錄配置文件(~/.bash_profile ,~/.bash_login 和~/.profile)中,係統
www.linuxidc.com
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技術,最新IT資訊等Linux專業類網站。
Bash學習筆記
第4 頁 共28頁
隻會source 一個(依次查找,一個不存在,查找下一個,找到就 source 它)。~/.profile
是為從sh 和ksh 的配置文件.profile 而來,~/.bash_login 是從csh 的配置文件.login
而來。這種機製的一個應用是如果你經常使用Bourne shell,你可以將其配置寫
在.profile 文件中,如果你又想增加Bash特有的環境控製命令,你可以將其在寫
入.bash_profile 文件中,然後在.bash_profile 中加入source .profile語句。
用戶登錄時默認不會source ~/.bashrc 文件,如果要用需要自行在腳本中加入。這
也是一般在.bash_profile 文件中有以下語句的原因:
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
.bash_profile 和/etc/profile 中定義的變量和alias 定義默認不會繼承到bash中。需
要這兩個文件定義的變量可以為子 shell 使用時可以使用export 語句將其轉化為環
境變量。alias 定義盡量放在.bashrc 或/etc/bashrc 文件中。
所有配置文件的執行順序如下
|- /etc/profile /etc/profile.d/*.sh
|- ~/.bash_profile (or ~/.bash_login, or ~/.profile)
| ~/.bashrc
| /etc/bashrc
|- ~/.bash_logout ( 退出時)
但應注意,係統隻自動讀取/etc/profile, ~/.bash_profile 和~/.bash_logout,其餘是自
定義的。
3.3 非交互式啟動
當Bash通過運行shell 腳本的方式啟動時就是非交互式的。非交互式啟動時,它將查看環
境變量BASH_ENV,擴展其值並運行它,就像運行了以下命令:
if [ -n “$BASH_ENV” ] ; then . “$BASH_ENV” ; fi
但是PATH 變量不用來查找文件名。
說明:
判斷shell 是否是交互式啟動可通過以下方式:
(1 ) 檢查’-‘ 特殊參數:
case “$-“ in
*i*) echo This shell is interactive ;;
*) echo This shell is not interactive ;;
esac
(2) 檢查PS1, 非交互式shell 它不會被設置:
if [ -z “$PS1” ]; then
echo This shell is not interactive
else
echo This shell is interactive
fi
當shell 交互式啟動時,有以下不同於非交互式啟動的行為:
(1 ) 讀入初始化文件;
(2 ) 作業控製默認啟動;
www.linuxidc.com
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技術,最新IT資訊等Linux專業類網站。
Bash學習筆記
第5 頁 共28頁
(3 ) 顯示 PS1,PS2;
(4 ) 命令行編輯功能;
(5 ) 命令曆史功能
(6 ) 別名擴展
(7 ) 定期檢查郵件,根據 MAIL, MAILPATH, MAILCHECK配置
(8 ) 擴展錯誤、重定向錯誤、exec 錯誤、解析命令錯誤等不會引起Bash退出
(9 ) 檢查 TMOUT 的值,如果固定秒在打印$PS1後沒有命令讀入退出
4. 注釋與幫助
Shell中的注釋是跟在# 號後麵的行,注釋可以單獨成為一行,也可以跟在命令後麵,與命
令共處一行;腳本的第一行的# 號是個例外(如#!/bin/bash),# !稱為幻數,內核根據它確定
哪個程序來解釋腳本的行。
如果是針對Bash編程,一定要在首行加上#!/bin/bash ,以防止腳本被錯誤的 shell 執行。
Shell常見的幫助命令是 man 和info 。man 工具可以顯示係統手冊頁中的內容,這些內容
大多數都是對命令的解釋信息。通過查看係統文檔中的 man 頁可以得到程序的更多相關主
題信息和Linux的更多特性。與man 相比,info 工具可顯示更完整的最新的 GNU工具信息。
應明白最新的幫助在 info 而不是man,因為很多 man 已經停止維護,而 info 則維護良好。
另外,可以使用 command –h (--help)命令對command 的使用方式進行查詢。Bash獨特之處
是它還提供了一個help 命令,其提供的幫助信息簡單明了。
5. 變量與數組
5.1 變量分類
Bash的變量按作用域可分為兩類:局部變量和環境變量(全局變量)。局部變量隻在創
建它們的shell 中可用。而環境變量在創建他們的 shell 及其派生子進程中使用。
Bash的變量又可以按照是否是用戶創建的分為:用戶定義變量和專有 shell 變量。
說明:局部變量可以通過簡單賦值或一個變量名來設置,或者用declare內置函數來設
置(不含-x 選項)。內置函數local可以用來創建局部變量,但僅限於在函數內使用。函數不
使用local 的變量在整個shell 中是可見的。環境變量可以用 declare –x 命令或者export
varname=value 命令來設置。
5.2 變量的命名與賦值
變量的命名規則:變量名必須以字母或下劃線字符開頭,其餘的字符可以是字母、數字
或下劃線字符。任何其他字符標誌著變量名的終止。變量名大小敏感。
變量賦值:給變量賦值時,等號周圍不能有任何空白符。為了給變量賦空值,可以在等
號後跟一個換行符。格式: name=[value]
注意:
初學者很容易犯在等號左右加空格的錯誤,必須注意!這是 shell 極特別的地方,
www.linuxidc.com
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技術,最新IT資訊等Linux專業類網站。
Bash學習筆記
第6 頁 共28頁
因為幾乎所有的編程語言都允許甚至建議=左右加空格。
變量定義時前麵不加$ 符號,而在引用時需要加。Bash的這一特點與AWK 和Perl
都有差別:AWK 無論定義和引用都不加$符號,而 Perl 的標量無論定義和引用都需
要加$ 符。
$name 是更一般形式的${name} 的簡單形式。兩者在大多數時候是可以互換的,但
是在可能引起歧義時需要加{} 表示對某一變量的引用。如果變量名跟隨一個不是字
母、數字或下劃線的字符,則可以省略括號。
給變量賦值的另一方式是變量替換。Bash的標準方式是$(UNIX command),同時
bash也兼容Bourne shell的`Unix command`方式。但是建議使用Bash的標準方式,
因為這種方式更靈活,而且不容易出錯(`` 方式很容易與單引號混淆)。
5.3 declare 選項
Bash提供兩個內置命令創建變量:declare 和typeset 。typeset 是為了與 Korn shell兼容,
建議使用declare 。declare 選項如下:
選項 含 義
-a 將變量當作一個數組。即分配元素
-f 列出函數的名稱和定義
-F 隻列出函數名
-i 將變量設為整型
-r 將變量設為隻讀
-x 將變量輸出到子 shell 中,相當於定義後用 export 將其變為環境變量
5.4 位置和特殊參量
首先說說參量與變量的區別:參量(parameter) 是儲存值的實體,它可以是一個名字、一
個數或者特殊的字符;變量(variable) 是以名字命名的參量。變量有一個值和 0 或多個屬性,
屬性通過以上declare 選項來設置。
位置和特殊參量 指 代 對 象
$0 腳本名
$# 位置參數個數
$* 所有的位置參數
$@ 未加引號時與$*的含義相同
$1…${N} 單獨的位置變量
$$ 當前shell 的PID
$- 當前的sh 選項設置
$? 已執行的上一條命令的退出值
$! 最後一個進入後台的作業 PID
$_ 上一條命令的最後一個參數
說明:以上參量除了$*和$@的區別外都容易理解。以下重點說明這兩者的區別:
$*是一個由所有位置參量組成的單一的字符串,由環境變量 IFS 第一個字符分隔;
相當於”$1c$2c…”, c 是IFS 的第一個字符;$@是N 個獨立的雙引字符串,由空格
www.linuxidc.com
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技術,最新IT資訊等Linux專業類網站。
Bash學習筆記
第7 頁 共28頁
分隔,即相當於”$1” “$2” … “$N” 。
舉例說明:
set a b c d
echo “$*” # a b c d
echo “$@” #a b c d
IFS=’,’
echo “$*” # a,b,c,d
echo “$@” #a b c d
function countargs
{
echo “$# args”
}
countargs “$*” #1 args
countargs “$@” #3 args
5.5 環境變量
環境變量是已經用 export 內置命令導出的變量,可在創建它們的 shell 及其子shell 中使用。
環境變量可能在/bin/login 程序,.bash_profile 文件中定義。Bash內置的環境變量如下:
變量名 含 義 說 明
CDPATH cd 命令的搜索路徑,以冒號分隔的目錄列表 sh 變量
HOME 主目錄。未指定目錄時,cd 命令指向該目錄 sh 變量
IFS 字段分隔符,一般是空格符、製表符和換行符,用於由命令
替換,循環結構中的表和讀取的輸入產生的詞的字段劃分
sh 變量
MAIL 如果該參數被設置為某郵件文件的名稱,而 MAILPATH 未
被設置,當郵件到達 MAIL 指定的文件時,shell 會通知用
戶
sh 變量
MAILPATH 由冒號分隔的文件名列表。如果設置了這個參數,隻要有郵
件到達任何一個由它指定的文件,shell 都會通知用戶。可
以用? 分隔指定郵件到來時顯示的消息(默認為You have
mail)
sh 變量
OPTARG 上一個有getopts 內置命令處理的選項參數的值 sh 變量
OPTIND 下一個有getopts 內置命令處理的參數的序號 sh 變量
PATH 命令搜索路徑。一個由冒號分隔的目錄列表,shell 用它來
搜索命令。空目錄名指代當前目錄。
sh 變量
PS1 主提示字符串。默認值是’\s-\v\$’ sh 變量
PS2 次提示符,默認值是’>’ sh 變量
BASH 調用bash 實例是使用的全路徑名
BASH_ARGC 當前bash 執行call 棧中每一幀的參數個數數組
BASH_ARGV 當前執行call 棧中所有參數的數組
BASH_COMMAN 當前或即將執行的 bash 命令
www.linuxidc.com
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技術,最新IT資訊等Linux專業類網站。
Bash學習筆記
第8 頁 共28頁
D
BASH_ENV 每一個新的 bash shell(包括腳本) 啟動時執行的環境文件。
BASH_EXECUTI
ON
_STRING
bash –c選項啟動的命令參數
BASH_LINENO 與FUNCNAME 的每一成員對應的源文件的行數變量數組,
${BASH_LINENO[$i]} 是調用${FUNCNAME[$i]} 時對應的
行數,對應文件名${BASH_SOURCE[$i]} ,使用LINENO
得到當前行數
BASH_REMATCH [[ 條件命令通過=~賦值的變量數組
BASH_SOURCE FUNCNAME 數組變量對應源文件名數組變量
BASH_SUBSHEL
L
每次一個子 shell 或子 shell 環境產生時加 1。初始值為 0
BASH_VERSINFO 當前 Bash 的版本信息數組
BASH_VERSINFO[0] 主版本號
BASH_VERSINFO[1] 小版本號
BASH_VERSINFO[2] 補丁級別
BASH_VERSINFO[3] build 版本
BASH_VERSINFO[4] release 狀態
BASH_VERSINFO[5] MACHTYPE 值
BASH_VERSION 當前Bash的版本信息
COLUMNS 設置該變量就給 shell 編輯模式和選擇的命令定義了編輯
窗口的寬度
COMP_CWORD
COMP_LINE
COMP_POINT
COMP_WORDBR
EAKS
COMP_WORDS
COMPREPLY
可編程完成相關變量
EMACS 如果 Bash 在環境中發現這一變量當 shell 以值’t’啟動
時,它假定 shell 是運行在 emacs shell 緩衝中,禁用行編
輯
EUID 隻讀當前用戶的 ID
FCEDIT fc 命令-e 選項使用的默認編輯器
FIGNORE 冒號(:)分隔的進行文件名補全時忽略的後綴列表,比
如’.o:~’
FUNCNAME 在當前執行調用棧中所有的 shell 函數名數組
GLOBIGNORE 冒號分隔變量,定義在文件名擴展(globbing)時被忽略的文
件列表
GROUPS 當前用戶所屬的組
histchars 最多三個字符用以控製命令曆史擴展、快速替換和
tokenization。第一個字符(通常為!)是曆史擴展符;第
二個字符(通常^)為快速替換符;可選的第三個字符(通
www.linuxidc.com
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技術,最新IT資訊等Linux專業類網站。
Bash學習筆記
第9 頁 共28頁
常為#)表示當一行第一個字符是這個字符時為注釋
HISTCMD 當前命令的命令曆史號
HISTCONTROL 冒號分隔的值,控製命令怎樣保存在命令曆史列表中。
如果設置 ignorespace 值,以一個空格符開頭的行將不會進
入曆史清單;如果設置了 ignoredups,與前一個曆史行匹配
的行不會寫入。ignoreboth 是前兩者的縮寫
HISTFILE 指定保存命令行曆史的文件名。默認值為~/.bash_history。
如果 unset,交互式 shell 退出時將不保存命令行曆史
HISTFILESIZE 曆史文件能包含的最大行數。默認值 500
HISTIGNORE 冒號分隔的模式,決定怎樣的命令保存在命令曆史中
HISTSIZE 記錄在命令行曆史中的命令數。默認為 500
注意HISTSIZE與HISTFILESIZE的不同:HISTSIZE定義一
個session中保存的命令數,HISTFILESIZE定義HISTFILE
文件保存的行數,是跨session的
HISTTIMEFORMAT 如果此變量被設置並且為非空值,它將用來格式化
strftime 的值,在 history 輸出命令時附加時間戳。此變
量有時比較有用
HOSTFILE 包含一個格式和/etc/hosts 一樣的文件的名稱,當 shell
需要補全一個主機名時將讀取該文件。文件可以交互式更
改。下一次試圖補全主機名時,bash 將新文件的內容添加
到已經存在的數據庫中
HOSTNAME 當前的主機名
HOSTTYPE 自動設置正在運行的機器類型。默認值由係統決定
IGNOREEOF 控製 shell 接收到單獨一個 EOF 字符作為輸入的行為
INPUTRC Readline 啟動文件的文件名,默認為~/.inputrc
LANG 用來為沒有以 LC_開頭的變量明確選取的種類確定 locale
類
LC_ALL 忽略 LANG 和任何其他 LC_變量的值
LC_COLLATE 確定對路徑名擴展的結果進行排序是的整理順序,以及匹配
文件名與模式時的範圍表達式,等價類和整理序列的行為
LC_CTYPE 確定字符解釋和文件名擴展和模式匹配時字符類的行為
LC_MESSAGES 確定用於轉換前麵有一個$的雙引號串的 locale
LC_NUMERIC 確定進行數值格式化的 locale
LINENO 每次 shell 在一個腳本或函數中替換代表當前連續行號
LINES 內置命令 select 使用來去定所選列表的列長度。在接收
SIGWINCH 時自動設置
MACHTYPE 包含一個描述正在運行 bash 的係統的串
MAILCHECK 定義 shell 將隔多長時間(以 s 為單位)檢查一次由參數
MAILPATH 或 MAILFILE 指定的文件,看看是否有郵件到達。
默認值 600。如果它設為 0,shell 每次輸出主提示符之前都
會去檢查郵件
OLDPWD 前一個工作目錄
OPTERR 如果設置為 1,顯示來自 getopts 內置命令的錯誤信息
www.linuxidc.com
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技術,最新IT資訊等Linux專業類網站。
Bash學習筆記
第10頁 共28 頁
OSTYPE 描述正在運行 bash 的操作係統 (比如 linux gnu)
PIPESTATUS 一個數組,包含一列最近在管道執行的前台作業的進程退出
狀態值
POSIXLY_CORRECT 如果這一變量在 bash 啟動時設置,shell 進入 POSIX 模式
PPID 父進程的進程 ID
PROMPT_COMMAND 賦給這個變量的命令將在主提示符顯示前執行
PS3 與 select 命令一起使用的選擇提示符串,默認值為#?
PS4 當開啟追蹤時使用的調試字符串,默認值為+。追蹤可以用
set –x 開啟
PWD 當前工作目錄,為 cd 設置
RANDOM 每次引用該變量,就產生一個隨即整數(0~32767)。隨機
數序列 seeding 可以通過給 RANDOM 賦值來初始化
REPLY 給 read 內置命令提供的默認參數
SECONDS 調用 shell 以來的秒數
SHELL 保存 shell 的全路徑名,如果未設置,賦值當前用戶登錄
shell 的全路徑名
SHELLOPTS 冒號分隔的 shell 選項,比如:
braceexpand:emacs:hashall:histexpand:history:intera
ctive-comments:monitor
SHLVL 每次一個新 Bash Instance 啟動時加 1,決定 Bash 嵌套的
深度
TIMEFORMAT 時間格式設定參數
TMOUT 設置退出前等待輸入的秒數
TMPDIR 如果設置,Bash 用來作為保存臨時文件的目錄
UID 當前用戶的用戶 ID,在 shell 啟動時初始化
5.6 數組
Bash支持一維數組,指標默認從 0 開始。數組賦值的方式有:
names=([2]=alice [0]=hatter [1]=duchess)
names=(hatter duchess alice)
names=(hatter [5]=duchess alice) #names[0]=hatter names[5]=duchess names[6]=alice
數組元素的引用方式: ${array[i]}
所有元素使用(@和*) :
for i in “${names[@]}” ; do
echo $i
done
使用${!array[@]} 來獲取有值的數組指標。使用 ${#array[i]}來獲取某一數組元素的長度,
${#array[@]} 或${#array[*]}是數組長度(非null 元素個數)
如果對數組重新賦值,原數組元素將會消失。可以使用 unset命令刪除整個數組或數組的某
一個元素:unset array 或者unset array[i]
說明:Bash的數組與C 的區別:C 中如果定義了array[1000],則array[0]~array[999] 都一
定是存在的,而Bash則不然。
www.linuxidc.com
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技術,最新IT資訊等Linux專業類網站。
Bash學習筆記
第11 頁 共28 頁
5.7 算術運算
Bash的算術運算可以通過多種方式實現:
(1 ) 直接賦值:使用declare –i 命令後可以直接對變量賦值或計算。但是這種方式很容易
出錯,應注意空格問題,引號問題。如
declare –i num
num=hello #error!
num=5 + 5 #error !不能有空格
num=”4 * 6” # 帶引號,可以有空格
num=6.789 #num=6 去尾
(2 ) 使用 let內置命令 i=5
let i=i+1
let “i = i +2” #帶空格需要加引號
let “i+=1”
let 支持的操作符如下:
操作符 含 義
- 負號
! 邏輯非
~ 按位取反
* 乘法
/ 除法
% 求模
+ 加法
- 減法
<< 左移位
>> 右移位
<= >= < > == != 關係運算符
& 按位與
^| 異或
&& 邏輯與
|| 邏輯或
! 邏輯非
= 賦值
*= /= %= += -=
<<= >>= &= ^= |=
賦值簡寫符
++ -- 自增 自減
** 乘方
expr? expr: expr 條件表達式
expr1, expr2 逗號表達式
(3 ) (( expression )) 方式。等價於 let “expression” ,但是更推薦使用,如果想返回表達
式的值,可使用$(( expression )) 方式
(4 )$[ expression ] 方式
(5 )expr expression 方式,以上 expr 是內置命令,但應注意乘法的使用方式:expr 3 \* 2,
www.linuxidc.com
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技術,最新IT資訊等Linux專業類網站。
Bash學習筆記
第12頁 共28 頁
說明:
以上(3 )( 4)兩種方式中括號前後可以有或沒有空格;裏麵的變量不需要帶$符。
可以使用[base#]n 來使用2~64進製數。
Bash隻支持整數運算,要進行更複雜運算需要借用 bc、awk 等工具。比如:
n=$(echo “scale=3; 13 / 2” | bc)
echo $n
5.8 字符串操作符
${}形式的變量引用允許字符串操作符,進行確保變量存在、為變量設置默認值、捕獲未定
義變量的錯誤以及刪除匹配某一模式的變量值部分等。
操作符 含 義
${variable:-word} 如果變量variable已被設置且非空,則代入它的值,否則代入word
${variable:=word} 設置一個變量的默認值如果其未定義
${variable:+word} 如果變量已被設置且值非空,代入 word,否則返回 null( 臨時替換
變量值)
${variable:?message} 如果變量已被設置且非空,返回其值;否則打印變量名,輸出
message,並從shell 中退出
${variable:offset:length} 獲取變量值中從offset 開始的長度為 length 的子串(第一個字符
為0, 如果未設定 length, 則獲取offset 之後的所有字符串)
${variable#pattern} 將變量值的頭部與模式進行最小匹配,並將匹配到的部分刪除
${variable##pattern} 將變量值的頭部與模式進行最大匹配,並將匹配到的部分刪除
${variable%pattern} 將變量值的尾部與模式進行最小匹配,並將匹配到的部分刪除
${variable%%pattern} 將變量值的尾部與模式進行最大匹配,並將匹配到的部分刪除
${#variable} 替換為變量的字符個數。如果是*或@,長度則是位置參量的個數
$ {variable/pattern/string}
$ {variable//pattern/string}
變量中最長匹配到 pattern 被替換為string, 第一種形式隻替換第一
個匹配;第二種形式替換所有匹配。如果 pattern 以# 開頭,必須
匹配變量開頭;如果以%開頭,必須匹配變量結尾。
${!prefix*}
${!prefix@}
擴展到以prefix 開始的變量名,以 IFS 頭一個字符分隔
${!name[@]}
${!name[*]}
如果name是數組變量,擴展至數組 key
*(patternlist) 0 或多個指定模式匹配
+(patternlist) 1 或多個指定模式匹配
?(patternlist) 0 或1 個指定模式匹配
@ (patternlist) 剛好1 個指定模式匹配
!( patternlist) 非指定模式匹配
(舉例)從完整文件名獲取文件目錄與文件名的方法:
filepath=”/home/test/a.txt”
dirname=${filepath%/*} # 得到目錄名/home/test
filename=${filepath##*/} # 得到文件名 a.txt
www.linuxidc.com
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技術,最新IT資訊等Linux專業類網站。
Bash學習筆記
第13頁 共28 頁
6. 條件結構
6.1 if語句
Bash if 語句的格式如下:
if test-commands ; then
consequence-command;
[elif more-test-commands; then
more-consequents; ]
[else alternate-consequents; ]
fi
test-commands執行後,如果其返回值是 0,執行consequence-command 語句。
說明:
注意在Bash中0 相當於C 中的true(1) ,而非 0 為false(0)。這一點與 C 語言相反,值
得特別注意。Bash如此定義True/False 的原因是可以用多種方式定義錯誤原因,而成
功隻有一種(0)。
語句if 中test-commands可以有多種形式,主要有:
(1 ) 命令或命令的並與或
if command ;then
if command1 && command2; then
if command1 || command2 ; then
(2 )test 表達式 (等價於[ ] 由於[是一個builtin, 所以與後麵的expr 應有空格)
以下是test 表達式的使用說明(參考 info test 命令)
操作符 測試內容
字符串測試
STRING1 = STRING2 True 如果兩字符串相等
STRING1 == STRING2 與上同,但不合 POSIX 標準
STRING1 != STRING2 True 如果兩字符串不相等
STRING1 < STRING2 STRING1小於STRING2
STRING1 > STRING2 STRING1大於STRING2
[ -n STRING
[ STRING
True 如果字符串長度不為 0
[ -z STRING True 如果字符串長度為 0
連接測試(邏輯測試)
[ ! EXPR True 如果EXPR 是false
[ EXPR1 –a EXPR2 如果EXPR1和EXPR2都為 true 是True
[ EXPR1 –o EXPR2 如果EXPR1或EXPR2都為 true 是True
數值測試
ARG1 –eq ARG2 相等測試
ARG1 –ne ARG2 不等
ARG1 –gt ARG2 大於
www.linuxidc.com
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技術,最新IT資訊等Linux專業類網站。
Bash學習筆記
第14頁 共28 頁
ARG1 –ge ARG2 大於等於
ARG1 –lt ARG2 小於
ARG1 –le ARG2 小於等於
文件特性測試
-e FILE True 如果文件存在
-s FILE 如果文件存在且大小大於 0 True
FILE1 –nt FILE2 如果文件FILE1 比FILE2 新( 修改時間),或者FILE1 存在
FILE2 不存在,返回 True
FILE1 –ot FILE2 如果文件FILE1 比FILE2 舊,或者FILE2 存在FILE1 不存在,
返回True
FILE1 –ef FILE2 如果文件FILE1 和FILE2 有相同的設備數和 inode 則返回True
比如他們是 hard links to each other
文件類型測試
-b FILE 塊專用文件
-c FILE 字符專用文件
-d FILE FILE存在並且是一個目錄
-f FILE FILE存在並且是一個普通文件
-h FILE
-L FILE
FILE存在並且是一個符號鏈接
-p FILE FILE存在並且是一個命名管道
-S FILE FILE存在並且是一個 socket
-t FD 如果FS是一個文件描述符並且被一個終端打開
文件訪問測試
-g FILE FILE存在並且Set – group- ID被設置
-k FILE FILE Sticky 位被設置
-r FILE FILE存在並且可讀
-u FILE FILE存在並且Set-user-ID 位被設置
-w FILE FILE存在並且可寫
-x FILE FILE存在並且可執行
-O FILE FILE存在且屬於有效用戶 ID
-G FILE FILE存在且屬於有效組 ID
(3 ) 複合 test 測試新格式[[ ]]
複合命令操作符[[ ]] 與普通test 命令的區別有:
中間操作符與變量以及[[ 之間不需要有空格
允許在字符串表達式中進行 shell 元字符擴展
變量不需要像老 test 命令中那樣用引號括起來,即使它包括多個詞的時候也是如此
雙等號可用來代替單個等號
!、 &&、|| 使用
(4 ) 使用 let命令測試數字(( )) (新格式)
比如x =2 ; y=3;
if (( x>2 ))
if (( x < 2 ))
if (( x == 2 && y ==3 ))
www.linuxidc.com
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技術,最新IT資訊等Linux專業類網站。
Bash學習筆記
第15頁 共28 頁
if (( x > 2 || y < 3 ))
注意以上變量前都不需要加$號!
6.2 case 語句
case 命令是一個多路分支命令,可用來代替 if/elif 命令。
case 命令的格式如下:
case variable in
value1)
commands ;;
value2)
commands ;;
*)
Commands ;;
esac
比如:
echo –n “Enter the name of an animal : “
read ANIMAL
echo –n “The $ANIMAL has “
case $ANIMAL in
horse | dog |cat) echo –n “four” ;;
man | kangaroo ) echo –n “two” ;;
*) echo –n “an unknown number of “;
esac
echo “ legs.”
注意事項:
case 分支是以雙分號(;;)結束,這一點很特別
*)表示默認執行值
6.2 select 語句
select 語句主要用於創建菜單。按數字順序排列的菜單項將列表顯示在標準輸出上,並顯示
PS3 提示符請求用戶輸入(PS3 默認值為’#?’ )。顯示 PS3 提示符後,shell 等待用戶輸入,
輸入應當是菜單列表中的一個數字。輸入值保存在 shell 特殊變量REPLY中。
select 命令的格式是:
select name [ in words … ]; do commands ; done
比如:
select fname in * ;
do
echo you picked $fname \($REPLY\)
break;
done
說明:
www.linuxidc.com
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技術,最新IT資訊等Linux專業類網站。
Bash學習筆記
第16頁 共28 頁
如果in words 省略,相當於 in “$@”
select 與case 經常可以配合使用
select 是一個循環命令,如果需要退出,使用 break命令或者使用 exit 退出腳本
6. 循環結構
Bash提供了以下三種類型的循環命令:
7.1 for 命令
格式為:
for name [in words … ]; do commands; done
如果in words 不存在,相當於 in $@ 。
另一格式的循環語句格式為:
for (( expr1; expr2; expr3 )) ; do commands; done
這種形式與 C 語言中使用的方式已經很相似了。
舉例1 :
IFS=:
for dir in $PATH
do
echo $dir
done
舉例2 :
for (( i=0; i<10; i++))
do
echo $i
done
7.2 while 命令
格式為:
while test-commands; do consequent-commands; done
舉例1 :
num=0
while (( $num < 10 ))
do
echo –n “$num”
let num+=1
done
舉例2 :
www.linuxidc.com
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技術,最新IT資訊等Linux專業類網站。
Bash學習筆記
第17頁 共28 頁
path=$PATH:
while [ $path ]; do
ls -ld ${path%%:*}
path=${path#*:}
done
7.3 until 命令
格式:
until test-commands; do consequent-commands; done
舉例【3 】:
until cp $1 $2; do
echo 'Attempt to copy failed. waiting...'
sleep 5
done
說明:
由於until test-commands; do consequent-commands; done 完全等價於
while ! test-commands; do consequent-commands; done
我們也可以不使用until 語句
Bash的until語句與C 語言中的 do until 循環是不同的:C 語言的do until 總是執行
do之後的語句直到until之後的條件滿足;而Bash中until 語句隻有until之後的條件
不滿足時才執行。
7.4 循環控製命令
Bash提供以下循環控製命令:
shift [n]: 將參數列表左移指定次數
break [n]: 強行退出循環,但不退出程序;break命令用數字作為參數,指定跳出哪層循環
continue [n]: 跳回循環的頂部
7. 函數
Bash 函數定義的格式如下:
[ function ] name () compound-command [ redirections ]
關於Bash函數的說明如下:
保留字function 是可選的,可以使用name() { }; 或者function name { }
由於曆史原因,在函數定義中{} 前後必須有空格,以為{和}在Bash中是作為保留字看
待的,這一點與C 語言有著很大區別,值得注意。初學者很容易在這一點上犯錯誤。
即以function f{command;} 的方式定義函數會報錯。
Bash shell按以下順序來判斷究竟是別名、函數、內置命令還是磁盤上的可執行程序:
先在別名中找,然後是函數、內置命令,最後才是可執行程序
www.linuxidc.com
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技術,最新IT資訊等Linux專業類網站。
Bash學習筆記
第18頁 共28 頁
函數必須先定義,後使用(也就是函數必須定義在腳本開始位置或者用source引入後
使用)
函數在當前環境中運行。函數共享調用它的腳本中的變量,可以使用 local 命令創建
局部變量
函數定義可以用unset –f命令刪除,或export –f命令導出到子腳本中
函數中return語句,返回函數執行的最後一條命令的退出狀態,或者返回指定的參數
值
如果在函數中使用exit命令,將會退出整個腳本
函數允許遞歸,且遞歸的次數沒有限製
函數參數。可以使用位置參數向函數傳遞參數。位置參數是函數私有的,也就是說,
函數對參數的操作不會影響在函數外使用的任何位置參量。
函數可以與內置命令同名,要在函數中使用內置命令,可以使用 builtin command 方
式命令command會取消別名和函數查找。
8.輸入輸出
9.1 標準I/O
Shell I/O 基本概念:
I/O 重定向通常與 FD(File Descriptor)有關,shell 的 FD 通常有 10 個,即 0~9
常見的 FD 有 3 個,為 0(stdin)、1(stdout)、2(stdout),默認與鍵盤、顯示器、顯
示器相連。
[n]<word 用來重定向輸入。word 代表的文件將打開代替標準輸入,如果 n 未指定,默
認為 0
[n]>[|]word 用來重定向輸出。word 代表的文件將打開寫 FD n。如果 n 未指定,默認
為 1。如果文件不存在將被創建,如果文件已經存在將被清除為 0 長度。word 前麵加|
用來忽略 noclobber 設置(如果不加,當 noclobber 為 on 時若文件存在將提示 cannot
overwrite existing file。
[n]>>word 用來重定向和追加輸出
[n]>&-用來關閉 FD n 的輸出,n 不指定默認為 1
[n]<&-用來關閉 FD n 的輸入,n 不指定默認為 0
管道“|”(pipe line):上一個命令的 stdout 接到下一個命令的 stdin
tee 命令是在不影響原本 I/O 的情況下,將 stdout 複製一份到文件
( ) 將 command group 置 於 sub-shell 去執行,也稱 nested sub-shell,它有一
點非常重要的特性是:繼承父 shell 的標準輸入輸出和錯誤和所有打開的 FD。
exec 命令:常用來替代當前 shell 並重新啟動一個 shell,換句話說,並沒有啟動
子 shell。使用這一命令時任何現有環境都將會被清除。exec 在對文件描述符進行操
作的時候,也隻有在這時,exec 不會覆蓋你當前的 shell 環境。
常見的 FD 有:
/dev/fd/n
/dev/stdin (0)
/dev/stdout (1)
/dev/stderr (2)
www.linuxidc.com
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技術,最新IT資訊等Linux專業類網站。
Bash學習筆記
第19頁 共28 頁
/dev/tcp/host/port (TCP socket)
/dev/udp/host/port (UDP socket)
9.2 重定向
重定向操作符 功 能
&> filename 重定向標準輸出和標準錯誤輸出
>& filename 重定向標準輸出和標準錯誤輸出(首選方式)
等價於 >word 2>&1
2>&1 將標準錯誤輸出重定向到輸出的去處
1>&2 將輸出重定向到錯誤輸出的去處
[n]<>filename 如果是一個設備文件,使用文件作為標準輸入和標準輸出
9.3 Here文檔
Here 文檔是一種特殊方式的引用。Here 文檔為需要輸入數據的程序接收內置文本,直到收
到用戶自定義的終止符。格式為
<<[-] word
Here-document
delimiter
若加-,則 delimiter 前麵的 TAB 將被忽略。
9.4 字符串I/O(echo、printf和read命令)
9.4.1 echo命令
命令 echo 將它的參數顯示在標準輸出上,echo 的選項和轉義序列如下:
選 項 含 義
-e 允許解釋轉義序列
-E 禁止解釋轉義字符
-n 刪除輸出結果中行尾的換行符
轉義序列
\a Bell
\b 退格
\c 不帶換行符打印一行
\f 換頁
\n 換行
\r 回車
\t 製表符
\v 縱向製表符
\\ 反斜杠
\nnn ASCII 碼是 nnn(八進製)的字符
www.linuxidc.com
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技術,最新IT資訊等Linux專業類網站。
Bash學習筆記
第20頁 共28 頁
9.4.2 printf命令
命令 printf 是 GNU 版本可以用來編排打印輸出的格式。它以和 C printf 函數相同的方式打
印格式串。但是與 C 語言的使用方式不同:采用 printf “fmt” arg1 … 而不是
printf(“fmt”, arg1,arg2)。
9.4.3 read命令
內置命令 read 用於從終端或文件讀取輸入,如果未指定變量,讀入的行將賦給變量 REPLY。
read 命令的使用格式如下:
格 式 含 義
read answer 從標準輸入讀取一行賦值給變量 answer
read first last 從標準輸入讀取一行賦值給變量 first last
read 從標準輸入讀取一行賦值給變量 REPLY
read –a arrayname 從標準輸入讀取一行賦值給數組 arrayname
read -e 在交互式 shell 中啟動編輯器
read –p prompt 打印提示符,等待輸入,並將輸入賦值給 REPLY 變量
read –r line 允許輸入包含反斜杠
10作業控製
格 式 含 義
%n 號為 n 的作業
%% %+ % 當前作業
%- 前一作業
%string 以 string 開始的作業
%?string 含 string 的作業
bg [jobspec] 後台恢複作業
fg [jobspec] 恢複作業到前台,使之稱為當前作業
jobs [-lnprs] [jobspec] 顯示作業狀態
-r 列出所有運行的作業 –s 列出所有掛起的作業
kill [-s sigspec] [- n
signum] [-sigspec]
jobspec or pid
Kill 作業
wait [jobspec or pid] 等待知道進程退出,返回退出狀態
disown [-ar] [-h]
[jobspec]
將作業從活動作業列表中移除
www.linuxidc.com
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技術,最新IT資訊等Linux專業類網站。
Bash學習筆記
第21頁 共28 頁
11 命令曆史
Bash 提供兩個內置命令來操作曆史列表和曆史文件:fc 和 history
fc 用來進行命令編輯:
fc [-e ename] [-nlr] first last
fc –s [pat=rep] command
history 命令的使用如下:
格 式 含 義
history [n] 顯示(最後 n 條作業)
history -c 清除命令曆史
history -d offset 清除位置在 offset 處的作業
history [-anrw]
filename
附加、讀、寫曆史文件
history –ps arg 進行曆史替換
事件指示器
! 說明開始曆史替換
!! 重新執行上一條命令
!N 重新執行曆史清單中的第 N 條命令
!-N 重新執行從當前命令往回數的第 N 條命令
!string 重新執行最後一條
!?string?% 重新執行曆史清單中最近一條包含串 string 的命令行參數
!$ 用上一條命令的最後一個參數作為當前命令行
!!string 將 string 添加到上一條命令的最後並執行
!N string 將 string 添加到曆史清單中的第 N 條命令的最後並執行
!N:s/old/new/ 將前麵的第 N 條命令中,將第一次出現的 old 串替換成 new 串
!N:gs/old/new/ 將前麵的第 N 條命令中,將所有出現的 old 串替換成 new 串
^old^new^ 在上一條命令中,用 new 串替換 old 串
Command !N:wn 在當前命令後添加一個來自前第 N 條命令的參數(wn)並執行
它。wn 是一個從 0,1,..開始的數
12雜項
12.1 set命令和選項
命令 set 用來打開或關閉 shell 選項,打開選項在前加一個減號(-),關閉一個選項,在選
項前加加號(+)。用set –o 命令來顯示所有 set 選項的狀態。set 選項如下:
快捷開關 選項名 含 義
-a allexport 從這個選項被設置開始就自動表明要輸出的新變
量或修改過的變量,直到選項關閉
-b notify 通知用戶什麼時候後台作業完成
-e errexit 當一個命令返回一個非零退出狀態時,退出。讀取
www.linuxidc.com
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技術,最新IT資訊等Linux專業類網站。
Bash學習筆記
第22頁 共28 頁
初始化文件時不設置
-f noglob 禁止文件名擴展
-h hashall 當查找執行時定位和存儲(hash)命令。默認開
-k keyword
所有的 keyword 參數,而不隻是那些命令名前的
keyword 參數,被放在環境命令中
-m monitor
允許作業控製
-n noexec
讀取命令但是不執行,這個用來檢查腳本的語法錯
誤
-o
[option-name]
不加 option-name 用來顯示所有 set 參數設置,加
用來設置某一項
-p privileged
打開特權模式(在此模式,$ENV 文件被處理,不能從
環境中繼承 shell 函數.如果是有效用戶 ID 而不是
實用戶組則自動啟動.關閉此選項將使得有效用戶
和組 ID 設置實用戶和組 ID)
-t onecmd
在讀取和執行一條命令後退出
-u nounset
如果一個變量沒有被設置就顯示一個錯誤
-v verbose
當讀取時打印 shell 輸入行
-x xtrace
打印命令的跟蹤(調試)
-B braceexpand
打開花括號擴展,默認設置
-C noclobber
防止文件在重定向時被重寫
-E errtrace
設置後,所有 ERR trap 將被子 shell 中的函數、
命令替換和命令繼承
-H history
打開命令行曆史,默認開
-P physical
如果設置,當執行命令cd時,不使用符號鏈接,而是
使用實際物理目錄
-T functrace
如果設置,所有 DEBUG和 RETURN的 trap 在子shell
環境中將被函數、命令替換和命令繼承
vi
使用 vi 內置編輯器進行命令編輯
emacs
使用 emacs 編輯器進行命令編輯,此項設置,則 vi
模式自動關閉
--如果此後不跟選項,位置參量被 unset,否則,位置
參量被設為後麵的值
-標誌選項的結束,所有剩下的參數都被賦值給位置
參量
www.linuxidc.com
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技術,最新IT資訊等Linux專業類網站。
Bash學習筆記
第23頁 共28 頁
12.2 shopt 命令和選項
Bash 2.x 以上的shopt 命令也可以用來打開或關閉 shell 選項。
shopt –s option-name 用來設置選項
shopt –u option-name 用來關閉選項
shopt [-p] 顯示所有選項
shopt [-q] Suppress normal output (quiet mode)
shopt –o 限製選項名為 set選項
shopt 命令選項如下:
選 項 含 義
cdable_vars 如果給cd 內置命令的參數不是一個目錄,就假定它是一個變量名,
變量的值是將要轉到的目錄
cdspell 糾正cd 命令中目錄名的較小拚寫錯誤
checkhash 在試圖執行一個命令前,先在 hash 中查找,以確定命令是否存在
checkwinsize 在每個命令後檢查窗口大小,必要時更新 LINES 和COLUMNS 值
cmdhist 設置後試圖將一個多行命令的所有行保存在同一個曆史項中。這使得
多行命令的重新編輯很方便
dotglob 在文件名擴展中包括以點(.) 開頭的文件名
execfail 如果一個非交互式 shell 不能執行指定給 exec 內置命令作為參數的文
件,它不會退出。如果 exec 失敗,一個交互式 shell 不會退出
expand_aliases 別名被擴展,默認開
extdebug 如果設置,調試功能打開
extglob 打開擴展的模式匹配特性
extquote 如果設置,$’string’和$”string” 引用在${parameter}擴展中使用。默認
開
failglob 如果設置,文件名匹配錯誤將報錯
force_fignore 如果set, FIGNORE 變量定義的後綴在詞補全時被忽略,默認開
gnu_errfmt 如果set, 以GNU錯誤信息格式寫錯誤信息
histappend Shell退出時曆史清單將添加到以 HISTFILE變量的值命名的文件中,
而不是覆蓋文件
histeedit 如果readline 正被使用,用戶有機會重新編輯一個失敗的曆史替換
histverify 如果設置,且readline 正被使用,曆史替換的結果不會立即傳遞給shell
解釋器。而是將結果行裝入 readline 編輯緩衝區,允許進一步修改
hostcomplete 如果設置,且readline 正被使用, 當正在完成一個包含@的詞時Bash
將試圖執行主機名補全
huponexit 如果設置,當一個交互式登錄shell 退出時,bash 將發送一個 SIGHUP
給所有的作業
interactive_comments 在一個交互式shell 中,允許以#開頭的詞以及同一行中其他的字符被
忽略,默認打開
lithist 如果打開,且 cmdlist 選項也打開,多行命令將用嵌入的換行符保存
到曆史中,而無需在可能的地方用分號分隔
mailwarn 如果設置,且 bash 用來檢查郵件的文件自從上次檢查後已經被訪問,
www.linuxidc.com
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技術,最新IT資訊等Linux專業類網站。
Bash學習筆記
第24頁 共28 頁
將顯示信息”The mail in mailfile has been read”
nocaseglob 執行文件名擴展時,Bash不區分大小寫的方式匹配文件名
nullglob 允許沒有匹配任何文件的文件名模式擴展成一個空串,而不是它本身
promptvars 提示串在擴展後再經曆變量和參量擴展,默認開
restricted_shell 受限模式啟動shell
shift_verbose 如果設置,移動計數超過位置參量個數時,shift 內置命令將打印一個
錯誤信息
sourcepath 如果設置,source 內置命令使用 PATH 的值來尋找包含作為參數提供
的文件的目錄,默認開
xpg_echo 如果設置,echo 命令擴展轉義序列(\)
12.3 exec 命令
命令exec 能夠在不啟動新進程的前提下,將當前正在運行的程序替換為一個新的程序。使
用exec 命令,不需創建子 shell 就能改變標準輸入和輸出。
12.4 trap 命令
命令trap 的使用方式如下:
trap cmd sig1 sig2 ...
當其捕獲到信號 sig1,sig2… 後執行命令 cmd 。
所有信號及其編號如下(用 kill –l或trap –l命令顯示):
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD
18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN
22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO
30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1
36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5
40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9
44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13
52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9
56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5
60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1
64) SIGRTMAX
www.linuxidc.com
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技術,最新IT資訊等Linux專業類網站。
Bash學習筆記
第25頁 共28 頁
13 命令行處理過程
Bash shell的命令行處理過程如下:
1. 以SPACE、TAB 、NEWLINE、; 、( 、) 、<、>,、|、和&等固定的元字符分割命令
成符號,符號的類型包括詞、關鍵字、I/O 重定向符和分號。
2. 檢查第一個符號,看它是否一個沒有引號或反斜線的關鍵字。如果其是一個開啟關鍵
字,比如 if 或其它控製結構開啟關鍵字,function、{ 或( ,則命令是一個複合命令。Shell
為複合命令進行內部設置後,讀入下一個命令,重新開始這一過程。如果關鍵字不是複
合命令開啟命令(比如控製結構中間符號像 then 、else 或do,結束符號像 fi 或done 或
邏輯操作符),shell 將報錯。
3. 別名替換。檢查第一個字是否命令別名。如果是,以別名定義替換並返回到第 1 步;
否則到第4 步。
4. 進行花括號擴展。比如 a{b,c} 變成ab ac
5. 波形符(~)擴展。以$HOME 代替~ ,以用戶的主目錄代替~user
6. 參數和變量擴展。替換任何以$號開始的表達式
7. 命令替換。對任何$(command)或`command` 的格式進行命令替換
8. 算術擴展。 對$(( expression )) 中的算術表達式進行計算
9. 字切割(Word Splitting) 。Shell將$IFS 參量的每一個字符作為一個分隔符,對其它擴
展的結果進行字切割。如果 IFS 未設置,默認為<space><tab><newline> 。
10. 文件名擴展。對*? 和[] 對進行文件名擴展(將其視為模式)
10.5.去除引號。在以上擴展之後,所有未用引號引起的字符\,’, 和”號將被去除。(這
一點需注意,因為它決定對命令執行時的整個語句的理解)
11 . 以第一個字按照函數、內置命令或$PATH 中的一個文件的順序作為命令
12. 在設置好I/O 重定向或者另外事情後運行命令。
最後更新:2017-04-03 15:21:43