Bash - Linux命令 - UNIX命令

名稱

bash - GNU Bourne-Again SHell

概要

bash [選項] [文件]

描述

Bashsh兼容的命令語言解釋器,執行從標準輸入或文件中讀取的命令。 Bash還集成了KornC shell( kshcsh )的有用特性。

Bash旨在成為IEEE POSIX Shell和Tools規範(IEEE Working Group 1003.2)的一致性實現。

OPTIONS

除了set內建命令描述中記錄的單字符外殼選項之外, bash在調用時會解釋下列選項:

-c 字符串

如果存在-c選項,則從字符串中讀取命令。 如果字符串後面有參數,則將它們分配給位置參數,從$ 0開始。

-一世

如果存在-i選項,則該shell是交互式的

-l

使bash的行為就好像它已被作為登錄shell調用一樣(請參閱下面的“ 調用” )。

-r

如果存在-r選項,則shell會受到限制 (請參見下面的RESTRICTED SHELL )。

-s

如果存在-s選項,或者在選項處理後沒有任何參數,則從標準輸入中讀取命令。 該選項允許在調用交互式shell時設置位置參數。

-D

在標準輸出上打印所有以$開頭的雙引號字符串的列表。 這些字符串在當前語言環境不是CPOSIX時受語言翻譯支配。 這意味著-n選項; 沒有命令將被執行。

[ - +] O [ shopt_option ]

shopt_optionshopt內置的shell選項之一(參見下面的SHELL BUILTIN命令 )。 如果shopt_option存在,則-O會設置該選項的值; + O解除它。 如果未提供shopt_option ,則shopt接受的shell選項的名稱和值將打印在標準輸出中。 如果調用選項為+ O ,則輸出將以可作為輸入重用的格式顯示。

-

A -表示選項結束並禁用進一步的選項處理。 -之後的任何參數都被視為文件名和參數。 一個論點-相當於-

Bash還解釋了一些多字符選項。 這些選項必須在要識別的單字符選項之前顯示在命令行上。

自卸寶串

相當於-D ,但輸出採用GNU gettext po (便攜式對象)文件格式。

自卸串

相當於-D

- 幫幫我

在標準輸出上顯示使用情況消息並成功退出。

--init文件 文件

--rc 文件

如果shell是交互式的,請從文件執行命令而不是標準個人初始化文件〜/ .bashrc (請參閱下面的“ 調用” )。

- 登錄

相當於-l

--noediting

當shell是交互式時,不要使用GNU readline庫來讀取命令行。

--noprofile

不要讀取全系統啟動文件/ etc / profile或任何個​​人初始化文件〜/ .bash_profile〜/ .bash_login〜/ .profile 。 默認情況下, bash在將其作為登錄shell進行調用時會讀取這些文件(請參閱下面的“ INVOCATION” )。

--norc

如果shell是交互式的,不要讀取和執行個人初始化文件〜/ .bashrc 。 如果將shell作為sh調用,則默認情況下此選項處於啟用狀態。

--posix

更改默認操作不同於POSIX 1003.2標準以匹配標準( posix模式 )的bash的行為。

--restricted

殼受到限制(請參見下面的RESTRICTED SHELL )。

--rpm-要求

產生shell腳本運行所需的文件列表。 這意味著'-n'並且受編譯時錯誤檢查檢查的限制; 反引號,[]測試和evals不解析,因此可能會錯過一些依賴關係。 --verbose相當於-v

- 版

在標準輸出中顯示此bash實例的版本信息並成功退出。

ARGUMENTS

如果參數在選項處理後仍然存在,並且沒有提供-c-s選項,那麼將假定第一個參數是包含shell命令的文件的名稱。 如果以這種方式調用bash ,則將$ 0設置為文件的名稱,並將位置參數設置為其餘參數。 Bash從該文件讀取並執行命令,然後退出。 Bash的退出狀態是在腳本中執行的最後一個命令的退出狀態。 如果沒有執行任何命令,則退出狀態為0.首先嘗試打開當前目錄中的文件,並且如果找不到文件,則shell會在PATH中搜索腳本中的目錄。

INVOCATION

登錄shell是其參數零的第一個字符是- 的一個,或者是使用--login選項啟動的一個。

交互式 shell是啟動時沒有非選項參數,並且沒有-c選項,其標準輸入和輸出都連接到終端(由isatty (3)確定),或者使用-i選項啟動。 PS1被設置,並且$ -包括如果bash是交互式的,允許shell腳本或啟動文件來測試這種狀態。

以下段落描述了bash如何執行其啟動文件。 如果有任何文件存在但無法讀取,則bash會報告錯誤。 在EXPANSION部分的Tilde擴展下,如下所述在文件名中擴展Tildes。

bash作為交互式登錄shell或作為具有--login選項的非交互式shell調用時,它首先從文件/ etc / profile讀取並執行命令(如果該文件存在)。 讀取該文件後,它會按照該順序查找〜/ .bash_profile〜/ .bash_login〜/ .profile ,並從第一個存在且可讀的命令讀取和執行命令。 當shell開始禁止這種行為時,可以使用--noprofile選項。

當登錄shell退出時, bash會從〜/ .bash_logout文件中讀取並執行命令(如果存在)。

當一個不是登錄shell的交互式shell啟動時,如果該文件存在, bash將讀取並執行〜/ .bashrc中的命令。 這可以通過使用--norc選項來禁止。 --rcfile 文件選項將強制bash文件讀取並執行命令,而不是〜/ .bashrc

例如,當bash以非交互方式啟動時,為了運行shell腳本,它在環境中查找變量BASH_ENV ,如果它出現在其中,則將其值展開,並使用擴展值作為文件的名稱來讀取和執行。 Bash的行為如同執行以下命令一樣:

如果[-n“$ BASH_ENV”]; 然後 。 “$ BASH_ENV”; 科幻

PATH變量的值不用於搜索文件名。

如果使用名稱sh調用bash ,它會盡可能地模仿歷史版本sh的啟動行為,同時也符合POSIX標準。 當作為交互式登錄shell或具有--login選項的非交互式shell進行調用時,它將首先嘗試從/ etc / profile〜/ .profile中按照該順序讀取和執行命令。 --noprofile選項可用於禁止此行為。 當作為名為sh的交互式shell進行調用時, bash會查找變量ENV ,如果定義了它,則展開它的值,並使用展開的值作為要讀取和執行的文件的名稱。 由於作為sh調用的shell不會嘗試從任何其他啟動文件讀取和執行命令,因此--rcfile選項不起作用。 用名稱sh調用的非交互式shell不會嘗試讀取任何其他啟動文件。 當作為sh調用時, bash在讀取啟動文件後進入posix模式。

bashposix模式啟動時,與--posix命令行選項一樣,它遵循啟動文件的POSIX標準。 在這種模式下,交互式shell會擴展ENV變量,並從名稱為擴展值的文件中讀取和執行命令。 沒有其他啟動文件被讀取。

Bash試圖確定它由遠程shell守護進程運行的時間,通常是rshd 。 如果bash確定它由rshd運行,它將讀取並執行〜/ .bashrc中的命令,如果該文件存在且可讀的話。 如果作為sh調用,它不會執行此操作。 --norc選項可用於禁止此行為,-- rcfile選項可用於強制讀取其他文件,但rshd通常不會使用這些選項調用shell或允許指定它們。

如果shell以有效用戶(組)id不等於真實用戶(組)id的方式啟動,並且未提供-p選項,則不會讀取啟動文件,shell功能不會從環境中繼承, SHELLOPTS如果它出現在環境中,則變量被忽略,並且有效用戶標識被設置為真實用戶標識。 如果在調用時提供-p選項,則啟動行為是相同的,但不重置有效的用戶標識。

定義

以下定義用於本文檔的其餘部分。

空白

一個空格或標籤。

一系列被shell視為單個單元的字符。 也被稱為令牌

名稱

一個只包含字母數字字符和下劃線,並且以字母字符或下劃線開頭。 也被稱為標識符

元字符

一個字符,當不加引號時,分隔單詞。 以下之一:

| &; ()<>空格標籤

控制操作員

執行控制功能的令牌 。 它是以下符號之一:

|| &&&; ;; ()| <換行符>

保留字

保留字是對shell有特殊含義的字。 下列單詞在未加引號時被識別為保留,並且可以是簡單命令的第一個單詞(見下面的SHELL GRAMMAR )或案例的第三個單詞或命令:

如果在select中,則直到while {} time [[]]時才執行elif else esac fi for function

殼格林瑪

簡單的命令

一個簡單的命令是一系列可選的變量賦值,後跟空白分隔的單詞和重定向,並由控制操作員終止。 第一個字指定要執行的命令,並作為參數零傳遞。 其餘單詞作為參數傳遞給被調用的命令。

簡單命令的返回值是其退出狀態,如果命令由信號n終止,則為128 + n

管道

管道是由字符“ |”分隔的一個或多個命令的序列 。 管道的格式是:

[ 時間 [ -p ]] [! ] 命令 [ | command2 ...]

命令的標準輸出通過管道連接到command2的標準輸入。 此連接在命令指定的任何重定向之前執行(請參閱下面的重定向 )。

如果保留字 在管道之前,該管道的退出狀態是最後一個命令的退出狀態的邏輯非。 否則,管道的狀態是最後一個命令的退出狀態。 在返回值之前,shell等待管道中的所有命令終止。

如果時間保留字位於管道之前,則在管道終止時會報告執行消耗的用時和用戶及系統時間。 -p選項將輸出格式更改為POSIX指定的格式。 TIMEFORMAT變量可以設置為格式字符串,用於指定應如何顯示時間信息; 請參閱下面的Shell Variables下的TIMEFORMAT說明。

管道中的每個命令都作為一個單獨的進程執行(即在一個子shell中)。

清單

列表是一個由一個操作員分隔的一個或多個管道的序列;&&|| ,並且可選地由以下之一終止;<新行>

在這些列表運算符中, &&|| 具有同等的優先權,其次是;&,它們具有相同的優先級。

一個或多個換行符的序列可能出現在列表中,而不是用分號來分隔命令。

如果命令被控制操作符終止,那麼shell在子shell中在後台執行該命令。 shell不會等待命令完成,並且返回狀態為0.由a分隔的命令; 按順序執行; shell等待每個命令依次終止。 返回狀態是執行的最後一個命令的退出狀態。

控制操作符&&|| 分別表示AND列表和OR列表。 AND列表具有這種形式

command1 && command2

當且僅當command1返回零的退出狀態時才執行command2

OR列表具有這種形式

command1 || 命令2

當且僅當command1返回非零退出狀態時才執行command2 。 AND和OR列表的返回狀態是在列表中執行的最後一個命令的退出狀態。

複合命令

複合命令是以下之一:

名單

列表在子shell中執行。 影響外殼環境的變量賦值和內置命令在命令完成後不會保持有效。 返回狀態是列表的退出狀態。

{ list ; }

列表僅在當前shell環境中執行。 列表必須以換行符或分號結尾。 這被稱為組命令 。 返回狀態是列表的退出狀態。 請注意,與元字符)不同{}保留字 ,必須出現在允許識別保留字的位置。 由於它們不會造成單詞中斷,因此必須用空格將它們與列表分開。

(( 表達式 ))

表達式根據以下在算術評估中描述的規則進行評估 如果表達式的值不為零,則返回狀態為0; 否則返回狀態為1.這完全等價於讓“ 表達式 ”。

[[ 表達 ]]

取決於對條件表達式表達式的評估,返回0或1的狀態。 表達式由CONDITIONAL EXPRESSIONS下面描述的初選組成 字符分割和路徑名擴展不在[[]]之間的單詞上執行; 代字符擴展,參數和變量擴展,算術擴展,命令替換,進程替換和報價移除。

當使用==!=運算符時,運算符右側的字符串被視為模式,並根據模式匹配下的規則進行匹配 。 如果字符串分別匹配或不匹配模式,則返回值為0,否則返回1。 模式的任何部分可能會被引用以強制它被匹配為一個字符串。

表達式可以使用以下運算符進行組合,按優先級的降序排列:

表達式

返回表達式的值。 這可以用來覆蓋運算符的正常優先級。

表達

如果表達式為假,則為真。

expression1 && expression2

如果expression1expression2都為真,則為true。

expression1 || expression2如果expression1expression2為真,則為true。

&&|| 如果expression1的值足以確定整個條件表達式的返回值,則運算符不會評估expression2。

名字 [ in word ]; 清單 ; DONE

接下來的單詞列表被展開,生成一個項目列表。 變量名稱依次設置到該列表的每個元素,並且每次都執行列表 。 如果省略了in for命令會為設置的每個位置參數執行一次列表 (請參見下面的參數 )。 返回狀態是執行的最後一個命令的退出狀態。 如果後續項目的擴展結果為空列表,則不會執行命令,並且返回狀態為0。

for (( expr1 ; expr2 ; expr3 )); 清單 ; DONE

首先,算術表達式expr1根據下面在算術評估下描述的規則來評估 然後重複評估算術表達式expr2,直到它計算為零。 每當expr2計算結果為非零值時,將執行列表併計算算術表達式expr3 。 如果省略了任何表達式,則其行為就如同它的計算結果為1.返回值是執行的列表中最後一個命令的退出狀態,如果任何表達式無效,則返回false。

選擇 名字 [ in word ]; 清單 ; DONE

接下來的單詞列表被展開,生成一個項目列表。 擴展詞的集合打印在標準錯誤上,每個詞前面都有一個數字。 如果省略 單字 ,則會打印位置參數(請參見下面的參數 )。 然後顯示PS3提示,並從標準輸入中讀取一行。 如果該行由與顯示的單詞相對應的數字組成,則名稱的值將被設置為該單詞。 如果該行為空,則會再次顯示文字和提示。 如果讀取EOF,則命令完成。 讀取的任何其他值都會導致名稱被設置為空。 讀取的行保存在變量REPLY中 。 該列表在每次選擇後執行,直到執行中斷命令。 select的退出狀態是在列表中執行的最後一個命令的退出狀態,如果沒有執行任何命令,則為零。

[[(] pattern [ | pattern ]

case命令首先擴展單詞 ,並嘗試使用與路徑名擴展相同的匹配規則(請參見下面的路徑名擴展 ),依次將其與每個模式進行匹配。 當找到一個匹配項時,相應的列表被執行。 第一場比賽之後,不會嘗試後續比賽。 如果沒有模式匹配,退出狀態為零。 否則,它是在列表中執行的最後一個命令的退出狀態。

如果 列表 ; 然後 列出; [ elif list ; 然後 列出 ; ] ... [ else list ; ] fi

if 列表被執行。 如果其退出狀態為零,則執行該列表 。 否則,依次執行每個elif 列表 ,如果其退出狀態為零,則執行相應的列表並執行命令。 否則,執行else 列表 (如果存在)。 退出狀態是最後執行的命令的退出狀態,如果沒有條件測試為真,則退出狀態為零。

名單 ; 清單 ; DONE

直到 列表 ; 清單 ; DONE

只要列表中的最後一個命令返回退出狀態為零, while命令就會連續執行do 列表until命令與while命令相同,只是測試是否定的; 只要列表中的最後一個命令返回非零退出狀態,就會執行do 列表whileuntil命令的退出狀態是執行的最後執行 列表命令的退出狀態,如果沒有執行任何命令,退出狀態為零。

[ function ] name (){ list ; }

這定義了一個名為name的函數。 函數的主體是{和}之間的命令列表 。 只要名稱被指定為簡單命令的名稱,就會執行該列表。 函數的退出狀態是在主體中執行的最後一個命令的退出狀態。 (請參閱下面的功能 。)

註釋

在非交互式shell或交互式shell中,其中啟用了shopt內建的interactive_comments選項(請參閱下面的SHELL BUILTIN COMMANDS ),以開頭的單詞會導致該單詞以及該行上的所有其餘字符被忽略。 沒有啟用interactive_comments選項的交互式shell不允許評論。 interactive_comments選項在交互式shell中默認處於打開狀態。

QUOTING

引用用於刪除特定字符或單詞對shell的特殊含義。 引用可用於禁用對特殊字符的特殊處理,以防止保留字被識別,並防止參數擴展。

DEFINITIONS下面列出的每個元字符對shell都有特殊的含義,如果要表示它自己,必須引用它。

當使用命令歷史擴展設備時,通常是歷史擴展字符 ,必須引用它來防止歷史擴張。

有三種引用機制: 轉義字符 ,單引號和雙引號。

一個不帶引號的反斜杠( \ )是轉義字符 。 它保留下一個字符的字面值,但例外。 如果出現一個\ <新行>對,並且反斜杠本身不被引用,則\ 被視為一個行延續(即從輸入流中移除並有效忽略)。

用單引號括起字符保留引號內每個字符的字面值。 單引號之間可能不會出現單引號,即使前面加了反斜線。

用雙引號括起字符保留了引號內所有字符的字面值,除$`\以外 。 字符$`在雙引號內保留其特殊含義。 反斜線只有在跟隨以下字符之一時才保留其特殊含義: $`\ 。雙引號可以在雙引號之前加上反斜杠。

使用雙引號時,特殊參數*@具有特殊含義(請參閱下面的參數 )。

特殊處理$ ' string '形式的單詞。 該字擴展為字符串 ,反斜杠轉義字符被替換為ANSI C標準指定的字符。 反斜杠轉義序列(如果存在)按如下方式解碼:

\一個

警報(鐘)

\ b

退格

。\ E

一個轉義字符

\F

形式飼料

\ n

新隊

\ r

回車

\ t

水平標籤

符\ v

垂直標籤

\\

反斜線

\“

單引號

\ nnn

值為八進制值nnn的八位字符(一到三位數字)

\ x HH

其值為十六進制值HH的八位字符(一個或兩個十六進制數字)

\ c x

一個控製字符

擴大的結果是單引號的,就好像美元符號不存在一樣。

以美元符號( $ )開頭的雙引號字符串將導致字符串根據當前語言環境進行翻譯。 如果當前區域設置為CPOSIX ,則忽略美元符號。 如果字符串被翻譯並替換,則替換為雙引號。

參數

參數是存儲值的實體。 它可以是名稱 ,數字或特殊參數下列出的特殊字符之一。 對於shell的目的, 變量是一個用名字表示的參數。 變量具有和零個或多個屬性 。 屬性使用declare builtin命令進行分配(請參閱下面的SHELL BUILTIN 命令中的 聲明 )。

如果參數已被賦值,則設置該參數。 空字符串是一個有效的值。 一旦設置了一個變量,只有使用未設置的內置命令才可以取消設置 (參見下面的SHELL BUILTIN命令 )。

變量可以通過表單的語句分配

name = [ value ]

如果未給出值,則會為該變量分配空字符串。 所有值都經過代數擴展,參數和變量擴展,命令替換,算術擴展和引用移除(請參閱下面的擴展 )。 如果變量具有其整數屬性集,則即使不使用$((...))擴展(請參見下面的算術擴展 ), 仍可進行算術擴展 。 除了 特殊參數 下面解釋的“$ @”之外,不會執行分詞。 不執行路徑名擴展。 賦值語句也可以作為declaretypesetexportreadonlylocal builtin命令的參數出現。

位置參數

位置參數是一個參數,由一個或多個數字表示,而不是單個數字0.位置參數在調用時由外殼參​​數分配,可以使用set builtin命令重新分配。 位置參數不能用賦值語句賦值。 當執行shell函數時,位置參數將被臨時替換(請參閱下面的函數 )。

當一個位置參數由多位數字組成時,它必須用大括號括起來(見下面的EXPANSION )。

特殊參數

shell專門處理幾個參數。 這些參數只能被引用; 不允許分配給他們。

*

從一個開始擴展到位置參數。 當擴展出現在雙引號內時,它將擴展為一個單詞,每個參數的值由IFS特殊變量的第一個字符分隔。 也就是說,“ $ * ”相當於“ $ 1 c $ 2 c ... ”,其中cIFS變量值的第一個字符。 如果IFS未設置,則參數由空格分隔。 如果IFS為空,則參數在沒有介入分隔符的情況下連接。

@

從一個開始擴展到位置參數。 當擴展出現在雙引號內時,每個參數都會擴展為單獨的單詞。 也就是說,“ $ @ ”相當於“ $ 1 ”“ $ 2 ”......當沒有位置參數時,“ $ @ ”和$ @展開為空(即它們被移除)。

展開為十進制位置參數的數量。

擴展到最近執行的前台管道的狀態。

-

通過set內建命令或由shell本身設置的那些(例如-i選項)擴展為當前選項標誌,如調用時指定的。

$

擴展為shell的進程ID。 在()子shell中,它擴展為當前shell的進程ID,而不是子shell。

擴展為最近執行的後台(異步)命令的進程ID。

0

擴展為shell或shell腳本的名稱。 這是在shell初始化時設置的。 如果bash使用命令文件調用, $ 0被設置為該文件的名稱。 如果bash-c選項開始,那麼$ 0被設置為要執行的字符串之後的第一個參數(如果存在的話)。 否則,它被設置為用於調用bash的文件名,如參數零所示。

_

在shell啟動時,設置為在參數列表中傳遞的shell或shell腳本的絕對文件名。 隨後,展開後展開到上一個命令的最後一個參數。 還設置為執行的每個命令的完整文件名,並將其置於導出到該命令的環境中。 在檢查郵件時,該參數保存當前正在檢查的郵件文件的名稱。

Shell變量

以下變量由shell設置:

BASH

擴展為用於調用此bash實例的完整文件名。

BASH_VERSINFO

一個只讀數組變量,其成員擁有此bash實例的版本信息。 分配給數組成員的值如下所示:

BASH_VERSINFO [ 0]

主版本號( 發行版 )。

BASH_VERSINFO [ 1]

次要版本號( 版本 )。

BASH_VERSINFO [ 2]

補丁程序級別。

BASH_VERSINFO [ 3]

構建版本。

BASH_VERSINFO [ 4]

發布狀態(例如beta1 )。

BASH_VERSINFO [ 5]

MACHTYPE的價值。

BASH_VERSION

擴展為描述這個bash實例版本的字符串。

COMP_CWORD

COMP_LINE

當前的命令行。 此變量僅在可編程完成工具調用的shell函數和外部命令中可用(請參見下面的可編程完成 )。

COMP_POINT

COMP_WORDS

數組變量(見下面的數組 ),由當前命令行中的單個詞組成。 此變量僅在可編程完成工具調用的shell函數中可用(請參見下面的可編程完成 )。

DIRSTACK

包含目錄堆棧當前內容的數組變量(請參見下面的數組 )。 目錄按其內置目錄顯示的順序出現在堆棧中。 分配給此數組變量的成員可用於修改已存在於堆棧中的目錄,但必須使用pushdpopd內建函數來添加和刪除目錄。 分配給這個變量不會改變當前目錄。 如果DIRSTACK未設置,即使後來重置,它也會失去其特殊屬性。

EUID

擴展為當前用戶的有效用戶ID,在shell啟動時初始化。 這個變量是只讀的。

FUNCNAME

任何當前正在執行的shell函數的名稱。 這個變量只有在shell函數執行時才存在。 對FUNCNAME的分配無效並返回錯誤狀態。 如果FUNCNAME未設置,即使隨後重置,它也會失去其特殊屬性。

包含當前用戶所屬的組的列表的數組變量。 對組的分配不起作用並返回錯誤狀態。 如果GROUPS未設置,即使隨後重置,它也會失去其特殊屬性。

HISTCMD

當前命令的歷史記錄號或歷史記錄列表中的索引。 如果HISTCMD未設置,即使隨後重置,它也會失去其特殊屬性。

主機名

自動設置為當前主機的名稱。

HOSTTYPE

自動設置為唯一描述bash執行的機器類型的字符串。 默認值是系統相關的。

LINENO

每次引用此參數時,shell都會在腳本或函數中用代表當前順序行號(從1開始)的十進制數代替。 當不在腳本或函數中時,替換值不保證有意義。 如果LINENO未設置,即使隨後重置,它也會失去其特殊屬性。

MACHTYPE

以標準GNU cpu-company-system格式自動設置為一個完整描述在其上執行bash的系統類型的字符串。 默認值是系統相關的。

OLDPWD

上一個工作目錄由cd命令設置。

OPTARG

getopts builtin命令處理的最後一個選項參數的值(請參閱下面的SHELL BUILTIN COMMANDS )。

OPTIND

getopts builtin命令要處理的下一個參數的索引(請參閱下面的SHELL BUILTIN COMMANDS )。

OSTYPE

自動設置為描述執行bash的操作系統的字符串。 默認值是系統相關的。

PIPESTATUS

一個數組變量(參見下面的數組 ),包含最近執行的前台流水線(可能只包含一個命令)中的進程的退出狀態值列表。

PPID

shell的父進程ID。 這個變量是只讀的。

PWD

當前工作目錄由cd命令設置。

隨機

每次引用此參數時,都會生成介於0和32767之間的隨機整數。 隨機數序列可以通過給RANDOM賦值來初始化。 如果RANDOM未設置,即使隨後重置,它也會失去其特殊屬性。

回复

當沒有參數提供時,設置為read builtin命令讀取的輸入行。

SECONDS

每次引用此參數時,都會返回自從shell調用返回後的秒數。 如果將值分配給SECONDS ,則在後續引用時返回的值是自賦值加上賦值後的秒數。 如果SECONDS未設置,即使隨後重置,它也會失去其特殊屬性。

SHELLOPTS

一個以冒號分隔的啟用shell選項列表。 列表中的每個單詞都是設置內置命令的-o選項的有效參數(請參閱下面的SHELL BUILTIN COMMANDS )。 出現在SHELLOPTS中的選項是按照-o設置報告的選項。 如果此變量位於bash啟動時的環境中,則在讀取任何啟動文件之前,將啟用列表中的每個shell選項。 這個變量是只讀的。

SHLVL

每次啟動一個bash實例時增加1。

UID

擴展為當前用戶的用戶ID,在shell啟動時初始化。 這個變量是只讀的。

以下變量由shell使用。 在某些情況下, bash會將一個默認值分配給一個變量; 這些案例如下所述。

BASH_ENV

如果在bash執行shell腳本時設置此參數,則其值將被解釋為包含用於初始化shell的命令的文件名,如〜/ .bashrc中所示BASH_ENV的值在被解釋為文件名之前經受參數擴展,命令替換和算術擴展。 PATH不用於搜索結果文件名稱。

CDPATH

cd命令的搜索路徑。 這是一個以冒號分隔的目錄列表,其中shell查找由cd命令指定的目標目錄。 示例值是“。:〜:/ usr”。

當選擇列表命令用於確定打印選擇列表時的終端寬度。 收到SIGWINCH後自動設置。

COMPREPLY

一個數組變量, bash讀取由可編程完成工具調用的shell函數生成的可能完成(參見下面的可編程完成 )。

FCEDIT

fc內建命令的默認編輯器。

FIGNORE

執行文件名完成時忽略冒號分隔的後綴列表(請參閱下面的READLINE )。 其後綴與FIGNORE中的一個條目相匹配的文件名將從匹配的文件名列表中排除。 示例值是“.o:〜”。

GLOBIGNORE

以冒號分隔的模式列表,用於定義由路徑名擴展忽略的一組文件名。 如果由路徑名擴展模式匹配的文件名也與GLOBIGNORE中的某個模式相匹配,則會從匹配列表中刪除該文件名。

HISTCONTROL

如果設置為忽略 空間值, 則以 空格字符開頭的行不會輸入到歷史記錄列表中。 如果設置為ignoredups的值,則不會輸入與上一個歷史記錄行匹配的行。 ignoreboth的值組合了這兩個選項。 如果未設置,或者設置為除上述值以外的任何其他值,解析器讀取的所有行都將保存在歷史列表中,並受到HISTIGNORE的值的限制 。 這個變量的函數被HISTIGNORE取代。 多行複合命令的第二行和後續行都未經過測試,並且無論HISTCONTROL的值如何,都將其添加到歷史記錄中。

HISTFILE

保存命令歷史記錄的文件的名稱(請參閱下面的歷史記錄)。 默認值是〜/ .bash_history 。 如果未設置,則交互式shell退出時不會保存命令歷史記錄。

HISTFILESIZE

歷史文件中包含的最大行數。 當這個變量被分配一個值時,如果需要,歷史文件將被截斷,以包含不超過該數量的行。 默認值為500.在交互式shell退出時,歷史文件在寫入之後也會截斷為此大小。

HISTIGNORE

用於決定哪些命令行應保存在歷史列表中的以冒號分隔的模式列表。 每個模式都固定在行的開頭,並且必須匹配完整的行(不添加隱式的' * ')。 在應用HISTCONTROL指定的檢查之後,將針對每條線測試每個模式。 除了正常的shell模式匹配字符之外,` '與之前的歷史記錄行相匹配。 ` '可能會使用反斜杠進行轉義; 在嘗試匹配之前移除反斜杠。 多行複合命令的第二行和後續行不會被測試,並且不管HISTIGNORE的值如何都將被添加到歷史記錄中。

HISTSIZE

命令歷史中要記住的命令的數量(請參閱下面的歷史記錄)。 默認值是500。

當前用戶的主目錄; cd內建命令的默認參數。 執行波浪擴展時也會使用此變量的值。

HOSTFILE

包含文件的名稱,格式與/ etc / hosts相同 ,應在shell需要完成主機名時讀取。 在shell運行時可能會更改可能的主機名完成列表; 下一次在值更改後嘗試主機名完成時, bash會將新文件的內容添加到現有列表中。 如果設置了HOSTFILE ,但沒有值, bash會嘗試讀取/ etc / hosts以獲取可能的主機名完成列表。 當HOSTFILE未被設置時,主機名列表被清除。

IFS

內部字段分隔符用於擴展後的字詞拆分,並使用讀取內置命令將字詞拆分為單詞。 默認值是`` ''。

IGNOREEOF

將接收到EOF字符的交互式shell的操作控制為唯一輸入。 如果設置,該值是連續EOF字符的數量,必須鍵入該值作為bash退出前輸入行上的第一個字符。 如果變量存在但沒有數字值或沒有值,則默認值為10.如果該變量不存在,則EOF表示輸入到shell的結束。

INPUTRC

readline啟動文件的文件名,覆蓋〜/ .inputrc的默認值(請參閱下面的READLINE )。

LANG

用於確定任何未使用以LC_開頭的變量專門選擇的類別的區域設置類別。

LC_ALL

該變量將覆蓋LANG的值和指定語言環境類別的任何其他LC_變量。

LC_COLLATE

此變量確定排序路徑名擴展結果時使用的排序順序,並確定路徑名擴展和模式匹配中的範圍表達式,等價類和整理序列的行為。

LC_CTYPE

這個變量決定了字符的解釋和字符類在路徑名擴展和模式匹配中的行為。

LC_MESSAGES

此變量確定用於翻譯以$開頭的雙引號字符串的區域設置。

LC_NUMERIC

此變量確定用於數字格式的區域設置類別。

LINES

select builtin命令用於確定打印選擇列表的列長度。 收到SIGWINCH後自動設置。

郵件

如果此參數設置為文件名並且未設置MAILPATH變量,則bash會通知用戶郵件到達指定文件。

MAILCHECK

指定bash檢查郵件的頻率(以秒為單位)。 默認值是60秒。 當需要檢查郵件時,shell會在顯示主要提示之前進行檢查。 如果此變量未設置,或者設置為不是大於或等於零的值,則shell會禁用郵件檢查。

MAILPATH

用於檢查郵件的冒號分隔的文件名列表。 郵件到達特定文件時要打印的郵件可以通過用'?'將郵件中的文件名與郵件分開來指定。 在消息文本中使用時, $ _擴展為當前郵件文件的名稱。 例:

MAILPATH ='/ var / mail / bfox?“你有郵件”:〜/ shell-mail?“$ _ has mail!”'

Bash為這個變量提供了一個默認值,但是它使用的用戶郵件文件的位置依賴於系統(例如,/ var / mail / $ USER )。

OPTERR

如果設置為值1, bash將顯示由getopts builtin命令生成的錯誤消息(請參閱下面的SHELL BUILTIN COMMANDS )。 每次調用shell或執行shell腳本時, OPTERR都被初始化為1。

路徑

命令的搜索路徑。 它是shell查找命令的冒號分隔的目錄列表(請參見下面的命令執行 )。 默認路徑取決於系統,由安裝bash的管理員設置。 一個常見的值是`/ usr / gnu / bin:/ usr / local / bin:/ usr / ucb:/ bin:/ usr / bin :.''。

POSIXLY_CORRECT

如果此變量在bash啟動時位於環境中,則在讀取啟動文件之前,shell會進入posix模式 ,就好像已經提供了--posix調用選項一樣。 如果在shell正在運行時設置它, bash將啟用posix模式 ,就像執行set -o posix命令一樣。

PROMPT_COMMAND

如果設置,則在發出每個主要提示之前,該值將作為命令執行。

PS1

此參數的值被展開(請參閱下面的PROMPTING )並用作主提示字符串。 默認值是`` \ s- \ v \ $ ''。

PS2

此參數的值與PS1一樣展開,並用作輔助提示字符串。 默認是`` > ''。

PS3

此參數的值用作select命令的提示(請參閱上面的SHELL GRAMMAR )。

PS4

此參數的值與PS1一樣展開,並且在執行跟踪期間顯示每個命令bash之前打印該值。 根據需要, PS4的第一個字符被複製多次,以指示多個間接級別。 默認值是“ + ”。

時間格式

該參數的值用作格式字符串,指定如何顯示以時間保留字為前綴的管道的定時信息。 字符引入了一個擴展為時間值或其他信息的轉義序列。 轉義序列及其含義如下; 大括號表示可選部分。

%%

字面

%[ p ] [l] R

經過的時間以秒為單位。

%[ p ] [l] U

在用戶模式下花費的CPU秒數。

%[ p ] [l] S

在系統模式下花費的CPU秒數。

%P

CPU百分比,按(%U +%S)/%R計算。

可選的p是指定精度的數字,小數點後的小數位數。 值為0不會導致輸出小數點或分數。 最多可以指定小數點後三位; p大於3的值將更改為3.如果未指定p ,則使用值3。

可選的l指定MM m SS格式的更長格式,包括分鐘。 FF s。 p的值確定是否包含分數。

如果未設置此變量,則bash的行為就好像它的值為$'\ nreal \ t%3lR \ nuser \ t%3lU \ nsys%3lS' 。 如果該值為空,則不顯示定時信息。 顯示格式字符串時添加尾隨換行符。

TMOUT

如果設置為大於零的值, TMOUT將被視為內置讀取的默認超時值。 如果輸入來自終端后, TMOUT秒後輸入未到達,則選擇命令終止。 在交互式shell中,該值被解釋為發出主要提示後等待輸入的秒數。 如果輸入沒有到達, Bash在等待那麼多秒後終止。

auto_resume

該變量控制shell如何與用戶和作業控制進行交互。 如果設置了此變量,那麼沒有重定向的單個單詞簡單命令將被視為恢復現有停止作業的候選項。 沒有歧義, 如果以鍵入的字符串開始的作業有多個作業,則選擇最近訪問的作業。 在這種情況下,停止的作業的名稱是用於啟動它的命令行。 如果設置為精確值,則提供的字符串必須與停止的作業的名稱完全匹配; 如果設置為子字符串 ,則提供的字符串需要匹配已停止作業名稱的子字符串。 子字符串值提供的功能類似於%? 作業標識符(請參見下面的JOB CONTROL )。 如果設置為任何其他值,則提供的字符串必須是已停止作業名稱的前綴; 這提供了類似於作業標識符的功能。

histchars

控制歷史擴展和標記的兩個或三個字符(請參閱下面的歷史擴展 )。 第一個字符是歷史擴展字符,這是指示歷史擴展開始的字符,通常是` “。 第二個字符是快速替換字符,它用作重新運行前一個輸入命令的簡寫形式,在命令中用一個字符串替換另一個字符串。 默認是` ^ '。 可選的第三個字符是表示當作為單詞的第一個字符被找到時,該行的其餘部分是註釋的字符,通常是` '。 歷史註釋字符導致歷史替換被跳過,以用於該行上的其餘單詞。 它不一定會導致shell解析器將該行的其餘部分視為註釋。

數組

Bash提供了一維數組變量。 任何變量都可以用作數組; 聲明內置將顯式聲明一個數組。 對數組的大小沒有最大限制,也沒有任何成員被索引或連續分配的要求。 數組使用整數進行索引,並且是從零開始的。

如果使用語法名稱 [ 下標 ] = 分配了任何變量,則會自動創建一個數組。 下標被視為一個算術表達式,它必須計算大於或等於零的數字。 要顯式聲明一個數組,請使用declare -a name (參見下面的SHELL BUILTIN COMMANDS )。 聲明-a 名稱 [ 下標 ]也被接受; 下標被忽略。 可以使用declarereadonly builtins為數組變量指定屬性。 每個屬性都適用於數組的所有成員。

數組被賦值為使用複合賦值形式name = value 1 ... value n ,其中每個的格式為[ subscript ] = string 。 只有字符串是必需的。 如果提供了可選的括號和下標,則將該索引分配給; 否則分配的元素的索引是由語句加上1的最後一個索引。 索引從零開始。 這個語法也被declare內建接受。 可以使用上面介紹的名稱 [ 下標 ] = 語法將單個數組元素分配給。

設置的內建函數用於破壞數組。 unset name [ subscript ]破壞索引下標處的數組元素。 unset name ,其中name是一個數組,或者取消設置 name [ subscript ],其中下標*@ ,將刪除整個數組。

declarelocalreadonly builtins每個都接受一個-a選項來指定一個數組。 內置接受-a選項以將從標準輸入讀取的單詞列表分配給數組。 setdeclare內建的顯示數組值可以讓它們作為賦值重用。

擴張

將命令行分割為單詞後,再進行擴展。 有七種類型的擴展: 括號擴展波形擴展參數和變量擴展命令替換算術擴展 ,分路徑名擴展

擴展的順序是:括號擴展,波形擴展,參數,變量和算術擴展和命令替換(按照從左到右的方式完成),單詞分割和路徑名擴展。

在可以支持它的系統上,還有一個額外的擴展可用: 進程替換

大括號擴展

Brace擴展是一種可以生成任意字符串的機制。 此機制與路徑名擴展類似,但生成的文件名不一定存在。 要擴展的模式採用可選的前導碼的形式,後跟一對大括號之間的一系列逗號分隔的字符串,然後是可選的後記 。 前導碼以大括號內包含的每個字符串為前綴,然後將postscript附加到每個結果字符串,從左向右擴展。

Brace擴展可以嵌套。 每個擴展字符串的結果都沒有排序; 從左到右的順序被保留。 例如, { d,c,b } e擴展為'ade ace abe'。

Brace擴展在任何其他擴展之前執行,並且任何對其他擴展特殊的字符都保留在結果中。 這是嚴格的文本。 Bash不會對擴展或大括號之間的文本應用任何語法解釋。

當要生成的字符串的公共前綴長於上面的示例時,該構造通常用作簡寫:

mkdir / usr / local / src / bash / {old,new,dist,bugs}

要么

chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}

Brace擴展引入與sh的歷史版本略有不兼容。 當sh作為單詞的一部分出現時, sh並不會特別地將它們作為開始或結束花括號,並將它們保留在輸出中。 作為大括號擴展的結果, Bash從單詞中刪除大括號。 例如,輸入為sh的文字{1,2}在輸出中出現相同。 在用bash擴展後,相同的單詞作為file1 file2輸出。 如果需要與sh嚴格兼容,請使用+ B選項啟動bash或使用set命令的+ B選項禁用大括號擴展(請參見下面的SHELL BUILTIN命令 )。

Tilde擴展

如果一個單詞以不加引號的代字符(' ')開始,則第一個非加引號的斜杠(或所有字符,如果沒有未加引號的斜杠)之前的所有字符都被視為字符前綴 。 如果沒有引用tilde-prefix中的字符,則在代字號後面的tilde-prefix中的字符將被視為可能的登錄名 。 如果此登錄名是空字符串,則代字號會被shell參數HOME的值替換。 如果HOME未設置,則執行該shell的用戶的主目錄將被替換。 否則,用指定的登錄名與關聯的主目錄替換波浪前綴。

如果代字符前綴是“〜+”,則shell變量PWD的值將替換代字號前綴。 如果代字符前綴是`〜 - ',則shell變量OLDPWD的值(如果設置)將被替換。 如果代字符前綴中的代字符後面的字符由數字N組成(可選地加上前綴+或代替),則代字號前綴將替換為目錄堆棧中的相應元素,因為它將顯示由用tilde-prefix作為參數調用的dir內建。 如果代字符前綴中的代字符後面的字符由沒有前導'+'或' - '的數字組成,則假定為'+'。

如果登錄名無效,或者代字號擴展失敗,則該單詞不變。

檢查每個變量分配的緊接在=之後的非引號波浪前綴。 在這些情況下,也會執行波浪擴展。 因此,可以在PATHMAILPATHCDPATH的賦值中使用帶有波形符的文件名,並且shell會分配擴展值。

參數擴展

' $ '字符引入了參數擴展,命令替換或算術擴展。 要擴展的參數名稱或符號可以用大括號括起來,這些大括號是可選的,但是可以用來保護變量從緊跟其後的字符擴展,這可以被解釋為名稱的一部分。

當使用大括號時,匹配的大括號是第一個沒有被反斜線或引用字符串轉義的` } ,並且不在嵌入的算術擴展,命令替換或參數擴展中。

參數的值被替換。 當參數是具有多個數位的位置參數時,或者當參數後面跟著不被解釋為其名稱一部分的字符時,需要使用大括號。

在下面的每種情況下, 單詞都會經歷代字符擴展,參數擴展,命令替換和算術擴展。 當不執行子字符串擴展時, bash將測試未設置或為空的參數; 省略冒號只會導致未設置參數的測試。

使用默認值 。 如果參數未設置或為空,則替換單詞的擴展。 否則, 參數的值將被替換。

分配默認值 。 如果參數未設置或為空,則將單詞的擴展分配給參數 。 然後用參數的值代替。 這種方式可能不會分配位置參數和特殊參數。

如果為空或未設置,則顯示錯誤 。 如果參數為空或未設置,則將單詞 (或單詞不存在時的消息擴展)寫入標準錯誤,並且如果不是交互式,則退出該shell。 否則, 參數的值將被替換。

使用替代值 。 如果參數為空或未設置,則不替換任何內容,否則替換單詞的擴展。

擴展為名稱以前綴開頭的變量名稱,用IFS特殊變量的第一個字符分隔。

參數值的字符長度被替換。 如果參數*@ ,則替換的值是位置參數的數量。 如果參數是以*@開頭的數組名稱,則替換值是數組中元素的數量。

這個被擴展為產生一個模式,就像路徑名擴展一樣。 如果模式匹配參數值的開始,那麼擴展結果是最短匹配模式(`` ''case)或最長匹配模式(`` ## ' '案例)刪除。 如果參數@* ,則模式刪除操作將依次應用於每個位置參數,並且擴展是結果列表。 如果參數是以@*為下標的數組變量,則將模式刪除操作依次應用於數組的每個成員,並且擴展是結果列表。

這個被擴展為產生一個模式,就像路徑名擴展一樣。 如果模式匹配參數擴展值的尾部分,則擴展結果是具有最短匹配模式(`` ''情況)或最長匹配模式(`` % % ''的情況下)刪除。 如果參數@* ,則模式刪除操作將依次應用於每個位置參數,並且擴展是結果列表。 如果參數是以@*為下標的數組變量,則將模式刪除操作依次應用於數組的每個成員,並且擴展是結果列表。

模式被擴展為產生一個模式,就像路徑名擴展一樣。 參數被擴展並且模式與其值的最長匹配被字符串替換。 在第一種形式中,只有第一個匹配被替換。 第二種形式導致模式的所有匹配被替換為字符串 。 如果模式開頭,則它必須在參數的擴展值的開頭匹配。 如果模式開頭,它必須在參數的擴展值的末尾匹配。 如果string為空,則刪除pattern的匹配,並且可以省略/ following 模式 。 如果參數@* ,則替換操作依次應用於每個位置參數,並且擴展是結果列表。 如果參數是以@*為下標的數組變量,則將替換操作依次應用於數組的每個成員,並且擴展是結果列表。

命令替換

命令替換允許輸出命令來替換命令名稱。 有兩種形式:

$( 命令

要么

` 命令 `

Bash通過執行命令執行擴展,並使用命令的標準輸出替換命令替換,刪除任何尾隨的換行符。 嵌入換行符不會被刪除,但可能會在分詞過程中被刪除。 命令替換$(cat file )可以被等價但更快的$(< file )替換。

當使用舊式的反引號替換形式時,反斜杠將保留其字面含義,除非後跟$`\ 。 不帶反斜杠的第一個反引號將終止命令替換。 使用$( command )形式時,括號之間的所有字符構成命令; 沒有人專門處理。

命令替換可能是嵌套的。 要在使用反引號形式時嵌套,請用反斜杠將內引號退出。

如果替換出現在雙引號內,則不會對結果執行單詞拆分和路徑名擴展。

算術擴展

算術擴展允許評估算術表達式並替換結果。 算術擴展的格式是:

$(( 表達式 ))

表達式被視為在雙引號內,但括號內的雙引號未被專門處理。 表達式中的所有令牌都經歷參數擴展,字符串擴展,命令替換和引用移除。 算術替換可以嵌套。

評估按照以下在算術評估中列出的規則進行 如果expression無效, bash會打印一條指示失敗的消息,並且不會發生替換。

流程替代

支持命名管道( FIFOs )的系統或命名打開文件的/ dev / fd方法支持進程替換 。 它採用<( list >( list )的形式 。 進程列表的輸入或輸出連接到FIFO/ dev / fd中的某個文件。 作為擴展的結果,此文件的名稱作為參數傳遞給當前命令。 如果使用>( 列表 表單,寫入文件將為列表提供輸入。 如果使用<( list 形式,則應讀取作為參數傳遞的文件以獲取列表的輸出。

如果可用,過程替換將與參數和變量擴展,命令替換和算術擴展同時執行。

分詞

shell掃描參數擴展,命令替換和算術擴展的結果,這些結果在雙引號內沒有出現,用於分

shell將IFS的每個字符視為分隔符,並將其他擴展的結果拆分為這些字符上的單詞。 如果IFS未設置,或者其值正好是<空格> <選項卡> <新行> ,則默認情況下,任何IFS字符序列都可用於分隔單詞。 如果IFS的值不是默認值,則只要空格字符在IFSIFS空白字符)的值中,空白字符空格製表符的序列就會在字的開頭和結尾被忽略。 IFS中不是IFS空白字符的任何字符以及任何相鄰的IFS空白字符都會分隔一個字段。 一系列IFS空格字符也被視為分隔符。 如果IFS的值為空,則不會發生分詞。

顯式空參數( “”“' )被保留。 由於擴展沒有值的參數而導致的未引用的隱式空參數將被刪除。 如果沒有值的參數在雙引號內擴展,則會生成一個空參數並保留。

請注意,如果不發生擴展,則不會執行分割。

路徑名稱擴展

在分詞之後,除非已設置-f選項,否則bash將掃描每個單詞的字符* ,? ,和[ 。 如果出現這些字符中的一個,則將該字視為模式 ,並用符合該模式的按字母順序排列的文件名列表替換。 如果找不到匹配的文件名,並且shell選項nullglob被禁用,則該字保持不變。 如果設置了nullglob選項,並且找不到匹配項,則會刪除該詞。 如果啟用shell選項nocaseglob ,則不考慮字母字符的情況下執行匹配。 使用模式進行路徑名擴展時,除非設置了shell選項dotglob ,否則必須明確匹配名稱開頭或斜線後面的字符“。” 。 匹配路徑名時,斜杠字符必須始終顯式匹配。 在其他情況下, “`。”“字符沒有被專門處理。 有關nocaseglobnullglobdotglob shell選項的說明,請參閱SHELL BUILTIN COMMANDS下面的shopt說明。

GLOBIGNORE shell變量可用於限制匹配模式的文件名集合。 如果設置了GLOBIGNORE ,則每個匹配的文件名都與匹配的GLOBIGNORE中的某個模式相匹配。 即使設置了GLOBIGNORE ,文件名“。”“..”也會被忽略。 但是,設置GLOBIGNORE具有啟用dotglob shell選項的效果,所以以“。”開頭的所有其他文件名都將匹配。 為了避免忽略以``。''開頭的文件名的舊行為,在GLOBIGNORE中創建``。*''模式之一。 當GLOBIGNORE未設置時, dotglob選項被禁用。

模式匹配

除了下面描述的特殊模式字符以外,出現在模式中的任何字符都與自身相匹配。 NUL字符可能不會出現在一個模式中。 如果字面意義上匹配,則必須引用特殊模式字符。

特殊模式字符具有以下含義:

*

匹配任何字符串,包括空字符串。

匹配任何單個字符。

[...]

匹配任何一個附上的字符。 用連字符分隔的一對字符表示範圍表達式 ; 任何使用當前語言環境的整理順序和字符集在這兩個字符之間進行排序的字符(包括這兩個字符)將進行匹配。 如果第一個字符是[ 或者^然後任何不包圍的字符匹配。 範圍表達式中字符的排序順序由當前語言環境和LC_COLLATE shell變量的值(如果設置)確定。 A -可以通過將它包括為集合中的第一個或最後一個字符來進行匹配。 A ]可以通過將其包括為集合中的第一個字符來匹配。

[]中 ,可以使用[: class :]語法指定字符類 ,其中class是POSIX.2標準中定義的以下類之一:

alnum alpha ascii空白cntrl數位圖下打印點位空間上位詞xdigit
一個字符類匹配屬於該類的任何字符。 單詞字符類匹配字母,數字和字符_。

[]中 ,可以使用語法[= c =]指定等價類,該語法將具有相同歸類權重(由當前語言環境定義)的所有字符與字符c匹配。

[]中 ,語法[。 符號 。]與整理符號符號匹配。

如果extglob shell選項使用shopt內建啟用,則可以識別多個擴展模式匹配運算符。 在以下描述中, 模式列表是由|分隔的一個或多個模式的列表 。 複合圖案可以使用一個或多個以下子圖案形成:

?( 模式列表

匹配給定模式的零次或一次出現

*( 模式列表

匹配零個或多個出現的給定模式

+( 模式列表

匹配一個或多個出現的給定模式

@( 模式列表

完全匹配給定模式中的一個

!( 模式列表

匹配除給定模式之外的任何內容

報價清除

在前面的擴展之後,刪除了不是由上述擴展之一產生的所有未加引號的字符\'

REDIRECTION

在執行命令之前,其輸入和輸出可能會使用由shell解釋的特殊符號重定向 。 重定向也可用於打開和關閉當前shell執行環境的文件。 以下重定向操作符可能先於或出現在簡單命令內的任何地方或可能遵循命令 。 重定向按照它們出現的順序從左到右進行處理。

在以下描述中,如果省略文件描述符編號,並且重定向操作符的第一個字符是< ,則重定向指的是標準輸入(文件描述符0)。 如果重定向操作符的第一個字符是> ,則重定向是指標準輸出(文件描述符1)。

除非另有說明,下列描述中的重定向操作符之後的單詞將經歷大括號擴展,波形符號擴展,參數擴展,命令替換,算術擴展,引用移除,路徑名擴展和分詞。 如果它擴展為多個單詞,則bash會報告錯誤。

請注意,重定向的順序很重要。 例如,該命令

ls > dirlist 2 >& 1

指揮標準輸出和標準錯誤的文件dirlist ,而命令

ls 2 >& 1 > dirlist

只將標準輸出指向文件dirlist ,因為在標準輸出重定向到dirlist之前,標準錯誤被重複為標準輸出。

如下表所述, Bash特別處理重定向中使用的多個文件名:

/ dev / fd / fd

如果fd是一個有效的整數,則文件描述符fd是重複的。

的/ dev /標準輸入

文件描述符0被複製。

的/ dev /標準輸出

文件描述符1被複製。

的/ dev /標準錯誤

文件描述符2被複製。

/ dev / tcp / host / port

如果主機是有效的主機名或Internet地址,並且端口是整數端口號或服務名稱,則bash將嘗試打開到相應套接字的TCP連接。

/ dev / udp / host / port

如果主機是有效的主機名或Internet地址,並且端口是整數端口號或服務名稱, bash會嘗試打開到相應套接字的UDP連接。

無法打開或創建文件會導致重定向失敗。

重定向輸入

輸入的重定向會導致文件描述符n的文本描述符n將被打開以讀取的擴展名,如果未指定n ,則輸入標準輸入(文件描述符0)。

重定向輸入的一般格式是:

[ n ] < 單詞

重定向輸出

輸出的重定向會導致文件的名稱由單詞的擴展名開始寫入文件描述符n ,如果未指定n ,則標準輸出(文件描述符1)。 如果文件不存在,則創建該文件; 如果它確實存在,則它被截斷為零大小。

重定向輸出的一般格式是:

[ n ] >

如果重定向操作符> ,並且啟用了set builtin的noclobber選項,則如果名稱由單詞擴展導致的文件存在並且是常規文件,則重定向將失敗。 如果重定向操作符是> | ,或者重定向操作符是>,並且set builtin命令的noclobber選項未啟用時,即使按命名的文件存在,也會嘗試重定向。

附加重定向輸出

以這種方式重定向輸出會導致名稱由單詞擴展導致的文件被打開以附加到文件描述符n或標準輸出(文件描述符1)(如果未指定n )。 如果該文件不存在,則會創建該文件。

追加輸出的一般格式是:

[ n ] >>

重定向標準輸出和標準錯誤

Bash允許將標準輸出(文件描述符1)和標準錯誤輸出(文件描述符2)重定向到名稱是此構造的單詞擴展名的文件。

有兩種格式可以重定向標準輸出和標準錯誤:

&>

>&

在這兩種形式中,第一種是首選。 這在語義上等同於

> 2 >& 1

這裡的文件

這種類型的重定向指示shell從當前源讀取輸入,直到看到只包含單詞 (沒有尾隨空白)的行。 所有讀到該點的行都被用作命令的標準輸入。

這裡的文件格式是:

<< [ - ] word here-document 分隔符

執行參數擴展,命令替換,算術擴展或路徑名擴展。 如果引用了單詞中的任何字符,則分隔符是對單詞的引用刪除的結果,並且此文檔中的行不會展開。 如果單詞不加引號,那麼這裡的文檔的所有行都要經過參數擴展,命令替換和算術擴展。 在後一種情況下,字符序列\ <新行>被忽略, \必須用於引用字符\$`

如果重定向操作符是<< - ,則所有前導製表符都從輸入行和包含分隔符的行中剝離。 這允許在這裡 - shell腳本中的文檔以自然的方式縮進。

這裡字符串

這裡的文件的一個變種,格式是:

<<< 一詞

單詞被擴展並提供給其標準輸入的命令。

複製文件描述符

重定向操作符

[ n ] <& word

用於復制輸入文件描述符。 如果單詞擴展為一個或多個數字,則將由n表示的文件描述符設為該文件描述符的副本。 如果單詞中的數字未指定打開文件描述符進行輸入,則會發生重定向錯誤。 如果單詞評估為- ,則文件描述符n關閉。 如果未指定n ,則使用標準輸入(文件描述符0)。

運營商

[ ] word

類似地用於復制輸出文件描述符。 如果未指定n ,則使用標準輸出(文件描述符1)。 如果單詞中的數字未指定打開輸出的文件描述符,則會發生重定向錯誤。 作為特殊情況,如果省略了n ,並且不擴展為一個或多個數字,則標準輸出和標準錯誤將按前面所述重定向。

移動文件描述符

重定向操作符

[ n ] <& digit -

如果未指定n ,則將文件描述符數字移至文件描述符n或標準輸入(文件描述符0)。 數字複製到n後關閉。

同樣,重定向操作符

[ n ] >& digit -

如果未指定n ,則將文件描述符數字移至文件描述符n或標準輸出(文件描述符1)。

打開文件描述符進行讀寫

重定向操作符

[ n ] <>

導致名稱為擴展名的文件在文件描述符n上讀取和寫入,如果未指定n ,則在文件描述符0上打開。 如果該文件不存在,則會創建該文件。

ALIASES

當它用作簡單命令的第一個單詞時, 別名允許用一個字符串替換一個單詞。 shell維護一個可以使用別名unalias內建命令設置和取消設置的別名 列表 (請參閱下面的SHELL BUILTIN COMMANDS )。 每個命令的第一個單詞,如果未加引號,則檢查它是否有別名。 如果是這樣,那麼這個單詞就會被別名的文本替換。 別名和替換文本可能包含任何有效的shell輸入,包括上面列出的元字符 ,但別名不能包含= 。 替換文本的第一個單詞是針對別名進行測試的,但與正在展開的別名相同的單詞不會再次展開。 這意味著,例如,可以將ls指定ls -F ,而bash不會嘗試遞歸地展開替換文本。 如果別名值的最後一個字符是空白 ,則會檢查別名後面的下一個命令字是否有別名擴展。

使用別名命令創建並列出別名 ,並使用unalias命令刪除別名

在替換文本中沒有使用參數的機制。 如果需要參數,應該使用shell函數(請參閱下面的函數 )。

除非使用shopt設置expand_aliases shell選項(請參閱下面的SHELL BUILTIN COMMANDS下的shopt描述),否則在shell不交互時不會擴展別名。

關於別名的定義和使用的規則有些令人困惑。 在執行該行上的任何命令之前, Bash總是讀取至少一個完整的輸入行。 在讀取命令時擴展別名,而不是在執行時。 因此,在讀取下一行輸入之前,與另一個命令出現在同一行上的別名定義才會生效。 該行別名定義之後的命令不受新別名的影響。 這種行為在執行函數時也是一個問題。 在讀取函數定義時擴展別名,而不是在執行函數時擴展別名,因為函數定義本身就是複合命令。 因此,函數中定義的別名在該函數執行之後才可用。 為了安全起見,請始終將別名定義放在單獨的行中,並且不要在復合命令中使用別名

幾乎所有的用途,別名都被shell函數取代。

功能

一個shell函數,如上面在SHELL GRAMMAR下描述的那樣定義存儲一系列命令供以後執行。 當shell函數的名稱用作簡單命令名時,將執行與該函數名相關聯的命令列表。 函數在當前shell的上下文中執行; 沒有新的進程被創建來解釋它們(與執行shell腳本相反)。 當一個函數被執行時,函數的參數在執行過程中成為位置參數。 特殊參數將更新以反映更改。 位置參數0不變。 FUNCNAME變量在函數執行時被設置為函數的名稱。 除了DEBUG陷阱(請參閱下面的SHELL BUILTIN COMMANDS下的陷阱內置描述)之外,shell執行環境的所有其他方面在函數和調用者之間是相同的,除非該函數已被賦予trace屬性(請參閱下面的聲明內置說明)。

該函數的局部變量可以用本地內建命令聲明。 通常,變量及其值在函數和調用者之間共享。

如果內建命令返回在函數中執行,則該函數完成並且在函數調用後的下一個命令中繼續執行。 當函數完成時,位置參數和特殊參數的值將恢復為它們在函數執行之前的值。

函數名稱和定義可以使用declaretypeset builtin命令的-f選項列出。 聲明排版-F選項僅列出函數名稱。 可以導出函數,以便子殼體自動使用-f選項將內容定義為內置導出

函數可能是遞歸的。 遞歸調用的數量沒有限制。

算術評估

在某些情況下,shell允許評估算術表達式(參見let builtin命令和算術擴展 )。 評估是以固定寬度的整數完成的,沒有檢查溢出,儘管除0被捕獲並標記為錯誤。 運算符及其優先級和關聯性與C語言中的相同。 下面的運算符列表被分組為相等優先級運算符的級別。 級別按優先級遞減順序列出。

id ++ id -

可變後增量和後減量

++ id - id

可變的預增量和預減量

- +

一元減號和加號

邏輯和按位否定

**

* /%

乘法,除法,餘數

+ -

加法,減法

<< >>

左右位移

<=> = <>

對照

==!=

平等和不平等

按位與

^

按位異或

|

按位或

&&

邏輯與

||

邏輯或

exprexprexpr

有條件評估

= * = / =%= + = - = << = >> =&= ^ = | =

分配

expr1expr2

逗號

允許Shell變量作為操作數; 在評估表達式之前執行參數展開。 在表達式中,shell變量也可以通過名稱來引用,而不使用參數擴展語法。 當被引用時,變量的值被評估為算術表達式。 一個shell變量不需要打開它的整數屬性來在表達式中使用。

前導0的常量被解釋為八進制數字。 前導的0x或0X表示十六進制。 否則,數字採用[ base# ] n的形式,其中base是代表算術基數的2到64之間的十進制數,而n是該基數中的數字。 如果鹼基#被省略,則使用鹼基10。 大於9的數字以小寫字母,大寫字母@和_順序表示。 如果基數小於或等於36,則小寫字母和大寫字母可互換使用,表示10到35之間的數字。

運算符按優先順序進行評估。 括號中的子表達式首先被評估並且可以覆蓋上面的優先規則。

有條件的表達

條件表達式由[[複合命令和測試[內建命令來測試文件屬性並執行字符串和算術比較]使用。 表達式由以下一元或二元基色形成。 如果其中一個基本文件的任何文件參數的格式為/ dev / fd / n ,則檢查文件描述符n 。 如果其中一個基本文件的文件參數是/ dev / stdin/ dev / stdout/ dev / stderr中的一個 ,則分別檢查文件描述符0,1或2。

- 一個 文件

如果文件存在則為真。

-b 文件

如果文件存在並且是塊特殊文件,則為true。

-c 文件

如果文件存在並且是字符特殊文件,則為真。

-d 文件

如果文件存在並且是目錄,則為真。

-e 文件

如果文件存在則為真。

-f 文件

如果文件存在並且是常規文件,則為true。

-g 文件

如果文件存在並且是set-group-id,則為true。

-h 文件

如果文件存在並且是符號鏈接,則為真。

-k 文件

如果文件存在並且其“粘滯”位已設置,則為真。

-p 文件

如果文件存在並且是命名管道(FIFO),則為真。

-r 文件

如果文件存在且可讀,則為真。

-s 文件

如果文件存在並且大小大於零,則為真。

-t fd

如果文件描述符fd是開放的並且引用終端,則為真。

-u 文件

如果文件存在並且其set-user-id位被設置,則為真。

-w 文件

如果文件存在且可寫,則為真。

-x 文件

如果文件存在且可執行,則為真。

-O 文件

如果文件存在並由有效用戶標識擁有,則為true。

-G 文件

如果文件存在並且屬於有效組ID,則為真。

-L 文件

如果文件存在並且是符號鏈接,則為真。

-S 文件

如果文件存在並且是套接字,則為true。

-N 文件

如果文件存在並且自上次讀取後已被修改,則為真。

file1 - nt file2

如果file1file2更新(根據修改日期),或者file1存在且file2不存在,則為true。

file1 - ot file2

如果file1file2舊,或者file2存在且file1不存在,則為true。

file1 -ef file2

如果file1file2引用相同的設備和inode編號,則為true。

-o optname

如果啟用了shell選項optname,則為true。 請參閱下面對內置集合-o選項的說明下的選項列表。

-z 字符串

如果字符串的長度為零,則為真。

-n 字符串

如果字符串的長度不為零,則為真。

string1 == string2

如果字符串相等,則為真。 =可用於代替==,以符合嚴格的POSIX標準。

string1 != string2

如果字符串不相等則為真。

string1 < string2

如果string1按字典順序排列在當前語言環境中, 則按 字符串排序。

string1 > string2

如果string1按當前語言環境中的字典順序排序,則返回 true。

arg1 OP arg2

OP-eq-ne-lt-le-gt-ge之一 。 如果arg1分別等於,不等於,小於,小於或等於,大於或大於或等於arg2 ,則這些算術二元運算符返回true。 Arg1arg2可能是正整數或負整數。

簡單的命令擴展

當執行一個簡單的命令時,shell從左到右執行以下擴展,分配和重定向。

1.解析器標記為變量賦值(命令名前面的那些)和重定向的單詞被保存以備後續處理。

2.不是變量賦值或重定向的單詞被擴展。 如果任何單詞在展開後仍然存在,則第一個單詞將被視為該命令的名稱,其餘單詞是參數。

3. 重定向按照上面在重定向下的描述執行。

4.每個變量賦值中=之後的文本在賦值給變量之前,經歷了代數擴展,參數擴展,命令替換,算術擴展和引用刪除。

如果沒有命令名稱結果,變量賦值會影響當前的shell環境。 否則,變量會添加到執行的命令的環境中,並且不會影響當前的shell環境。 如果任何分配嘗試為只讀變量賦值,則會發生錯誤,並且該命令以非零狀態退出。

如果沒有命令名稱,則執行重定向,但不會影響當前的shell環境。 重定向錯誤導致命令以非零狀態退出。

如果在擴展後留下命令名稱,則執行過程如下所述。 否則,該命令退出。 如果其中一個擴展包含命令替換,則該命令的退出狀態是最後執行的命令替換的退出狀態。 如果沒有命令替換,則該命令以狀態0退出。

指揮執行

在命令被分成單詞後,如果它產生一個簡單的命令和一個可選的參數列表,則採取以下動作。

如果命令名不包含斜杠,shell會嘗試找到它。 如果通過該名稱存在shell函數,則按照上述FUNCTIONS中的說明調用該函數 。 如果名稱與函數不匹配,shell會在shell內建列表中搜索它。 如果找到匹配項,則調用該內建程序。

如果該名稱既不是shell函數也不是內建函數,並且不包含斜線,則bash將通過該名稱搜索包含可執行文件的目錄的每個PATH元素。 Bash使用哈希表來記住可執行文件的完整路徑名(請參閱下面的SHELL BUILTIN COMMANDS下的哈希 )。 只有在散列表中找不到該命令時,才會執行PATH中目錄的完整搜索。 如果搜索不成功,shell會打印一條錯誤消息並返回127的退出狀態。

如果搜索成功,或者命令名稱包含一個或多個斜杠,則shell會在單獨的執行環境中執行指定的程序。 參數0被設置為給定的名稱,並且該命令的其餘參數被設置為給定的參數(如果有的話)。

如果由於該文件不是可執行格式導致執行失敗,並且該文件不是目錄,則假定它是一個shell腳本 ,一個包含shell命令的文件。 子shell被生成執行它。 這個子shell自己重新初始化,所以效果就好像一個新的shell已經被調用來處理腳本,除了父子記住的命令的位置(參見下面的SHELL BUILTIN命令下面的hash )被孩子保留。

如果該程序是以開頭的文件 ,第一行的其餘部分為該程序指定一個解釋器。 shell在不處理這種可執行格式的操作系統上執行指定的解釋器。 解釋器的參數由程序第一行解釋器名稱後面的單個可選參數組成,後跟程序名稱,後跟命令參數(如果有的話)。

指揮執行環境

該shell有一個執行環境 ,它由以下部分組成:

*在調用時由外殼繼承的打開文件,通過提供給exec內建的重定向修改

*當前工作目錄由cdpushdpopd設置 ,或者在調用時由shell繼承

*由umask設置的文件創建模式掩碼或從shell的父項繼承

*陷阱設置的當前陷阱

*通過變量賦值或在環境中設置或從shell的父項繼承而設置的shell參數

*在執行期間定義的shell函數或從環境中的shell父項繼承的shell函數

*在調用時啟用的選項(默認或通過命令行參數)或通過設置

*由shopt啟用的選項

*別名定義的shell 別名

*各種進程ID,包括後台作業的ID, $$的值和$ PPID的值

當執行除內建函數或shell函數以外的簡單命令時,將在包含以下內容的獨立執行環境中調用它。 除非另有說明,否則這些值是從shell繼承而來的。

* shell的打開文件,以及通過重定向到命令指定的任何修改和添加

*當前工作目錄

*文件創建模式掩碼

*標記為導出的shell變量以及為該命令導出的變量,在環境中傳遞

*由shell捕獲的陷阱重置為從shell的父項繼承的值,並且被shell忽略的陷阱被忽略

在這個單獨的環境中調用的命令不會影響shell的執行環境。

命令替換和異步命令在與shell環境重複的子shell環境中調用,不同之處在於,shell捕獲的陷阱重置為shell在調用時從其父節點繼承的值。 作為流水線一部分調用的內置命令也在子外殼環境中執行。 對子shell環境所做的更改不會影響shell的執行環境。

如果一個命令後跟一個並且作業控制未激活,則該命令的默認標準輸入是空文件/ dev / null 。 否則,被調用的命令會繼承重定向修改後的調用shell的文件描述符。