bash命令列解釋順序

2021-06-02 06:51:58 字數 1340 閱讀 5839

shell從標準輸入或指令碼中讀取的每行稱為乙個管道行,它包含乙個或多個由0個或多個管道字元(|)分隔的命令。對每乙個管道行,進行12個步驟的處理。

結合上面的插圖,這裡給出命令列的12個步驟。

1. 將命令列分成由固定元字符集分隔的記號 :

space, tab, newline, ; , (, ), , |, &

記號型別包括單詞,關鍵字,i/o重定向符和分號。

2.檢測每個命令的第乙個記號,檢視是否為不帶引號或反斜線的關鍵字。 如果是乙個開放的關鍵字,如if和其他控制結構起始字串,function,變成ab ac

5.如果~位於單詞開頭,用$home替換~。使用usr的主目錄替換~user。

6.對任何以符號$開頭的表示式執行引數(變數)替換

7.對形式$(string)的表示式進行命令替換

這裡是巢狀的命令列處理。

8.計算形式為$((string))的算術表示式

9.把行的引數,命令和算術替換部分再次分成單詞,這次它使用$ifs中的字元做分割符而不是步驟1的元字符集。

10.對出現*, ?, [ / ]對執行路徑名擴充套件,也稱為萬用字元擴充套件

11. 按命令優先順序表(跳過別名),進行命令查尋

12.設定完i/o重定向和其他操作後執行該命令。

關於引用

要思考的問題:

1.echo `echo ///z` 的輸出 和 echo `echo z` 的輸出。

2.在bash中:

$echo "//"

輸出:/

$a='//'

$echo "$a"

輸出://

解釋原因。

原因:這與bash命令列處理的順序有關。bash中對引用(單雙引號和/)的處理在對引數擴充套件(展開變數)之前,所以將$a的值代入命令列之後bash就不再解釋轉義或稱作逃逸字元。有時為了讓shell再次進行命令列的一系列處理,需要使用eval。

其實有兩種方法讓輸出結果為/:

方法一、echo -e "$a"

方法二、eval echo "$a"

其中方法一是通過改變 echo命令的執行方式達到結果,

方法二是通過改變shell處理來達到結果。

3.echo `echo //` 與 echo $(echo //)的輸出分別是什麼?解釋原因。

原因: ``裡面的/是乙個特殊字元,可以用它來引用特殊的字元(當然包括它自身/),而$()裡面的/只是普通字元。

echo `echo //`命令,裡層的echo //得到的結果/,於是外層命令為echo /,輸出結果就為空了。

echo $(echo //)命令,裡層的/不再作為特殊字元,其輸出就是//,於是外層命令為echo //,輸出結果就為/了。

git 命令列解釋

git git checkout 本地所有修改的。沒有的提交的,都返回到原來的狀態 git checkout 檔案 本地修改的檔案,恢復到原來的狀態 git stash 把所有沒有提交的修改暫存到stash裡面 git stash pop git reset hard hash 返回到某個節點,不保...

bash命令列操作svn

cd 跳到指定檔案目錄 ls 列出當前檔案目錄下的所有子檔案 svn up 更新專案 將資源檔案從svn上打包下來 通過執行指令碼 chmod u x assets builder.php 修改許可權 assets builder.php build 壓縮 assets builder.php pa...

shell 命令列直譯器

shell 命令列直譯器 dash bash 軟體,是shell的一種 root 超級使用者,不受限制 linux是乙個多工,多使用者作業系統。linux許可權管理 linux對每乙個檔案都進行許可權管理 1.檔案許可權管理 u 檔案的許可權是針對使用者的許可權,使用者分了三類 g 檔案所有者 這個...