如果您想在Linux、macOS或其他類似UNIX的系統上掌握bashshell,那麼特殊字元(如~、*、|和>;)是至關重要的。我們將幫助您解開這些神祕的Linux命令序列,成為象形文字的英雄。
bashshell以兩種不同的方式處理一組字元。當您在shell中鍵入它們時,它們充當指令或命令,並告訴shell執行特定的功能。可以將它們視為單字元命令。
有時,你只想列印一個字元,而不需要它作為一個魔術符號。有一種方法可以用一個字元來表示它自己,而不是它的特殊功能。
我們將向您展示哪些字元是“特殊”或“元”字元,以及如何從功能和字面上使用它們。
波浪號(~)是主目錄的縮寫。這意味著您不必在命令中鍵入主目錄的完整路徑。在檔案系統中的任何位置,都可以使用此命令轉到主目錄:
cd ~也可以將此命令用於相對路徑。例如,如果您位於檔案系統中不在主資料夾下的某個位置,並且希望更改為工作目錄中的存檔目錄,請使用顎化符:
cd ~/work/archive句點(.)表示當前目錄。如果將-a(all)選項與ls一起使用,則可以在目錄列表中看到它。
ls -a您還可以在命令中使用句點來表示當前目錄的路徑。例如,如果要從當前目錄執行指令碼,可以這樣呼叫它:
./script.sh這告訴Bash在當前目錄中查詢指令碼.sh檔案。這樣,它就不會在路徑中的目錄中搜索匹配的可執行檔案或指令碼。
雙句點或“雙點”(..)表示當前目錄的父目錄。您可以使用它在目錄樹中向上移動一級。
cd ..您還可以將此命令用於相對路徑,例如,如果要在目錄樹中向上一級,然後在該級輸入另一個目錄。
您還可以使用此技術快速移動到目錄樹中與當前目錄處於同一級別的目錄。你跳上一級,然後又回到另一個目錄。
cd ../gc_help您可以使用正斜槓(/)—通常稱為斜槓來分隔路徑名中的目錄。
ls ~/work/archive一個正斜槓表示可能的最短目錄路徑。由於Linux目錄樹中的所有內容都從根目錄開始,因此可以使用以下命令快速移動到根目錄:
cd /大多數情況下,您使用雜湊或數字符號(#)來告訴shell下面的內容是一個註釋,它不應該對其執行操作。您可以在shell指令碼中使用它,而在命令列中使用它則不太有用。
# This will be ignored by the Bash shell但是,它並沒有真正被忽略,因為它已新增到您的命令歷史記錄中。
您還可以使用雜湊來修剪字串變數並從開頭刪除一些文字。此命令建立一個名為This\u string的字串變數。
在本例中,我們指定文字“Dave Geek!“到變數。
this_string="Dave Geek!"此命令使用echo將單詞“How to”列印到終端視窗。它透過引數展開檢索儲存在字串變數中的值。因為我們附加了雜湊和文字“Dave”,所以在傳遞給echo之前,它會修剪掉字串的這一部分。
echo How-To ${this_string#Dave}這不會更改字串變數中儲存的值;它隻影響傳送到echo的內容。我們可以使用echo再次列印字串變數的值並檢查:
echo $this_stringbashshell支援三個萬用字元,其中一個是問號(?)。使用萬用字元替換檔名模板中的字元。包含萬用字元的檔名形成了一個模板,該模板匹配一系列檔名,而不僅僅是一個檔名。
問號萬用字元正好代表一個字元。考慮以下檔名模板:
ls badge?.txt這可以翻譯為“列出任何檔案,其名稱以‘badge’開頭,後跟副檔名之前的任何單個字元。”
它匹配以下檔案。請注意,有些檔名的“徽章”部分後面有數字,有些有字母。問號萬用字元將匹配字母和數字。
檔名模板不匹配“徽章.txt,因為檔名在“badge”和副檔名之間沒有一個字元。問號萬用字元必須與檔名中的相應字元匹配。
還可以使用問號查詢檔名中具有特定字元數的所有檔案。這將列出檔名中正好包含五個字元的所有文字檔案:
ls ?????.txt您可以使用星號(*)萬用字元來表示任何字元序列,不包括任何字元。考慮以下檔名模板:
ls badge*這符合以下所有條件:
它匹配“徽章.txt“因為萬用字元代表任何字元序列或不代表任何字元。
此命令匹配所有名為“source”的檔案,而不考慮副檔名。
ls source.*如上所述,問號表示任何單個字元,星號表示任何字元序列(不包括任何字元)。
可以使用方括號([])及其包含的字元形成萬用字元。檔名中的相關字元必須至少與萬用字元集中的一個字元匹配。
在本例中,該命令轉換為:“副檔名為“.png”的任何檔案,檔名以“pipes\u 0”開頭,下一個字元為2、4或6。”
ls badge_0[246].txt每個檔名模板可以使用多組括號:
ls badge_[01][789].txt也可以在字符集中包含範圍。下面的命令選擇檔名中數字為21到25以及31到35的檔案。
ls badge_[23][1-5].txt您可以在命令列中鍵入任意數量的命令,只要用分號(;)分隔每個命令。我們將在以下示例中執行此操作:
ls > count.txt; wc -l count.txt; rm count.txt請注意,第二個命令即使第一個失敗也會執行,第三個命令即使第二個失敗也會執行,依此類推。
如果要在一個命令失敗時停止執行序列,請使用雙符號(&&)而不是分號:
cd ./doesntexist && cp ~/Documents/reports/* .在終端視窗中鍵入命令並完成後,返回命令提示符。通常,這隻需要一兩分鐘。但是,如果啟動另一個應用程式(如gedit),則在關閉該應用程式之前不能使用終端視窗。
但是,您可以將應用程式作為後臺程序啟動並繼續使用終端視窗。為此,只需在命令列中新增一個與號:
gedit command_address.page &Bash向您顯示啟動的程序的程序ID,然後返回到命令列。然後可以繼續使用終端視窗。
許多Linux命令接受一個檔案作為引數,並從該檔案獲取資料。這些命令中的大多數還可以從流中獲取輸入。要建立流,請使用左尖括號(<),如以下示例所示,將檔案重定向到命令中:
sort < words.txt當命令將輸入重定向到其中時,它的行為可能與從命名檔案讀取時不同。
如果我們使用wc來計算檔案中的單詞、行和字元,它會列印值,然後列印檔名。如果我們將檔案的內容重定向到wc,它將列印相同的數值,但不知道資料來自的檔案的名稱。它無法列印檔名。
以下是一些如何使用wc的示例:
wc words.txt wc < words.txt可以使用右尖括號(>)將命令的輸出重定向到檔案中;下面是一個示例:
ls > files.txt cat files.txt如果將數字(在我們的示例中為2)與>;一起使用,則輸出重定向還可以重定向錯誤訊息;。以下是操作方法:
wc doesntexist.txt 2> errors.txt cat errors.txt相關:Linux上的stdin、stdout和stderr是什麼?
“管道”將命令連結在一起。它接受一個命令的輸出並將其作為輸入提供給下一個命令。管道命令的數量(鏈的長度)是任意的。
在這裡,我們將用貓來餵食物的內容文字.txt檔案匯入grep,grep提取任何包含小寫或大寫“C”的行。grep然後將這些行傳遞給sort。sort使用-r(reverse)選項,因此排序的結果將以相反的順序顯示。
我們鍵入以下內容:
cat words.txt | grep [cC] | sort -r感嘆號(!)是一個邏輯運算子,表示不是。
此命令列中有兩個命令:
[ ! -d ./backup ] && mkdir ./backup第一個命令使用!作為邏輯運算子。方括號表示要進行測試。d(directory)選項測試是否存在名為backup的目錄。第二個命令建立目錄。
因為雙符號將這兩個命令分開,所以只有第一個命令成功,Bash才會執行第二個命令。然而,這與我們需要的恰恰相反。如果對“backup”目錄的測試成功,我們就不需要建立它。如果對“backup”目錄的測試失敗,第二個命令將不會被執行,丟失的目錄也不會被建立。
這就是邏輯運算子的位置!進來了。它起著邏輯非門的作用。因此,如果測試成功(即目錄存在),則!將其轉換為“不成功”,即失敗。所以,第二個命令沒有被啟用。
如果目錄測試失敗(即目錄不存在),則!將響應改為“不失敗”,即成功。因此,將執行建立丟失目錄的命令。
那個小傢伙!當你需要的時候,可以裝很多拳頭!
要檢查備份資料夾的狀態,請使用ls命令以及-l(長列表)和-d(目錄)選項,如下所示:
ls -l -d backup也可以使用感嘆號從命令歷史記錄中執行命令。history命令列出您的命令歷史記錄,然後鍵入要重新執行的命令的編號!如下圖所示:
!24以下命令將重新執行上一個命令:
!!在bashshell中,建立變數來儲存值。有些變數(如環境變數)總是存在的,您可以在開啟終端視窗時隨時訪問它們。這些值包含使用者名稱、主目錄和路徑等值。
您可以使用echo檢視變數名前面帶有美元符號($)的值,如下所示:
echo $USER echo $HOME echo $PATH要建立一個變數,必須給它一個名稱並提供一個值讓它儲存。您不必使用美元符號來建立變數。僅在引用變數時新增$,如以下示例中所示:
ThisDistro=Ubuntu MyNumber=2001 echo $ThisDistro echo $MyNumber在美元符號周圍新增大括號({}),並執行引數展開以獲取變數的值,並允許進一步轉換值。
這將建立一個包含字串的變數,如下所示:
MyString=123456qwerty使用以下命令將字串回顯到終端視窗:
echo ${MyString}要返回從整個字串的位置6開始的子字串,請使用以下命令(偏移量為零,因此第一個位置為零):
echo ${myString:6}如果要回顯從位置0開始幷包含後面六個字元的子字串,請使用以下命令:
echo ${myString:0:6}使用以下命令回顯從位置4開始幷包含下四個字元的子字串:
echo ${myString:4:4}如果要使用特殊字元作為文字(非特殊)字元,則必須告訴Bash shell。這叫做引用,有三種方法。
如果將文字括在引號(“…”)中,這將阻止Bash對大多數特殊字元執行操作,而它們只是列印。不過,一個值得注意的例外是美元符號($)。它仍然充當變量表達式的字元,因此可以在輸出中包含變數的值。
例如,此命令列印日期和時間:
echo "Today is $(date)"如果按如下所示將文字括在單引號(“…”)中,則會停止所有特殊字元的功能:
echo 'Today is $(date)'可以使用反斜槓(\)來防止下列字元用作特殊字元。這稱為“轉義”字元;請參見下面的示例:
echo "Today is \$(date)"把特殊字元看作是非常簡短的命令。如果你記住了它們的用法,它可以極大地幫助你理解bashshell和其他人的指令碼。
相關:您應該知道的37條重要的Linux命令
...使用者友好的Linux作業系統(OS)提供了大量功能,而不需要進入終端,但它是作業系統的一個必要元素。與流行的觀點相反,命令列甚至可以簡化某些操作。 ...
...會出錯。Windows使用CR-LF組合(回車換行)進行換行。這隻需要轉換成LF。請檢查您的Windows編輯器,以瞭解執行此操作的方法。 ...
... 如果您剛剛開始或在終端中花費了大量時間,您可能需要自定義外觀、感覺和各種屬性。我們將向您展示一些有趣的方法來定製終端,使其最適合您的環境和工作流。 ...
...資訊。因為它已經包含在GNU核心實用程式包中,所以您不需要在系統上安裝任何附加包就可以使用它。 ...
...元進行編碼。另一方面,Unicode是如此之大,以至於我們需要使用不同的術語來討論它! ...
...,特別是那些利用其他現有程式的任務。這種自動化通常需要重複幾次類似的操作,這正是for迴圈進入自己的位置。 ...
...端視窗中鍵入命令所需的時間。為了測試它的速度,我們需要一個25萬個數字的列表。 我們鍵入以下命令,使用time命令檢視該過程需要多長時間才能完成: time seq 250000 結果顯示在列表下方。即使在我們中等功率的測試PC上,seq...
... shopt內建 shopt內建是bashshell所有版本的一部分,因此不需要安裝任何東西。多年來,shopt提供的選項數量穩步增加。所以,Bash的版本越舊,shopt選項的列表就越短。 如果您的機器上似乎有什麼不工作,請檢查Bash的手冊頁條目,...
...確保shell配置正確。這些變數還確保終端視窗和shell可能需要引用的任何資訊都可用。總的來說,這些變數儲存的設定定義了在終端視窗中找到的環境,一直到命令提示符的外觀。所以,自然地,它們被稱為環境變數。 一些環境...