15 個你非瞭解不可的 Linux 特殊字符

不知道大家接觸 Linux 系統有多久了,可曾瞭解過 Linux 中有哪些特殊的字符呢?其實啊,那些特殊字符都大有用處呢,今天的文章就給大家簡單地科普一下 Linux 中你需要了解的 15 個特殊字符,想學或剛學 Linux 的小夥伴趕緊上車了為!

~ 主目錄

這個波浪號 ~ 指的是主目錄,也就是我們用戶的個人目錄,無論你身在何方,輸入 cd ~ 它將帶你回家!

<code>cd ~/<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

更高端的玩法就是在它後面加上具體的路徑,直接定位到家目錄中的指定位置,是不是很方便呢?

<code>cd ~/work/archive/<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

. 當前目錄

英文句號 . 代表當前目錄,我們來看一下當前目錄下的全部文件:

<code>ls -al/<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

紅圈裡的 . 就是指當前目錄,不過這沒什麼意義,我們更多的是在命令中使用它,如下:

<code>./script.sh/<code>

這樣做是在告訴 bash 只要在當前目錄中查找並執行>

收藏 | 15 個你非瞭解不可的 Linux 特殊字符

.. 父目錄

兩個英文句號 .. 代表父目錄,也就是當前目錄的上一級目錄。假設我們要回到上一級目錄:

<code>cd ../<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

跟前面一樣,你可以在它後面加具體的目錄,這裡的意思就是定位到與當前目錄同級的其它目錄:

<code>cd ../projects//<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

/ 路徑目錄分隔符

斜槓 "/" 指的是路徑目錄分隔符,這裡沒什麼好說的。

<code>ls ~/work/tests//<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

但是,有意思的是,如果 / 路徑目錄分隔符前面沒有東西的話,是不是就是意味著這是最上級的目錄了?由於 Linux 系統的目錄樹均始於

/ ,所以僅僅一個 / 代表了我們常說的系統根目錄

<code>cd //<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

# 註釋

# 開頭,代表這句話是註釋

<code># This will be ignored by the Bash shell/<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

雖然上面那段話就被忽略了,但它還是會添加到您的命令歷史記錄中。

更厲害的做法如下:

先定義一個變量並給它賦值字符串 “amazing alvin”

<code>this_string="amazing alvin"/<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

${this_string#amazing} 返回的是被註釋掉 amazing 的 this_string 字符串變量,可以 echo 輸出看下結果:

<code>echo awsome ${this_string#amazing}/<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

amazing 只是被註釋掉而已,它並未被刪除,去掉註釋它就回來了:

<code>echo $this_string/<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

? 單字符通配符

問號 "?",指的是單字符通配符。Bash Shell 支持三種通配符。

它代表文件名中

任意一個字符的匹配,例如:

<code>ls badge?.txt/<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

注意,它與 badge.txt 是不匹配滴,因為 badge 後面沒有字符。

正因為 "?" 匹配單個字符,所以這裡有個看似很厲害的玩法,就是你想要的找的文件的文件名有多少個字符,你就輸入多少個

"?"

<code>ls ?????.txt/<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

看著挺厲害,不過我怎麼感覺這好彆扭?????

* 字符序列通配符

星號 * 代表的是任意字符序列匹配任意字符,包括空字符

,以剛才的 badge 為例:

<code>ls badge*/<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

可以看到,badge.txt 都匹配到了。

匹配任意類型的文件:

<code>ls source.*/<code>

[] 字符集通配符

方括號 "[]"

指的是字符集通配符,文件名中的相關字符必須與字符集中的至少一個字符匹配。通過例子來體會一下它的作用吧:

<code>ls badge_0[246].txt/<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

<code>ls badge_[01][789].txt/<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

<code>ls badge_[23][1-5].txt/<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

; 命令分隔符

這跟我們日常使用的 ";" 差不多,就不細說了,主要是用來分隔命令的。

<code>ls > count.txt; wc -l count.txt; rm count.txt/<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

這裡注意,用 ; 分隔命令時,即使第一個命令失敗,第二個命令也會運行,即使第二個命令失敗,第三個命令也會運行,依此類推。

如果要在一個命令失敗的情況下就停止,請使用 "&&" ,如下:

<code>cd ./doesntexist && cp ~/Documents/reports/* ./<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

& 後臺處理

有時候在終端正在運行一個命令時,例如 vim,你想運行另外一個命令怎麼辦?這裡有個小技巧就是在命令後面加一個 "&" 符號,將這個程序放在後臺啟動,這樣你就能在終端實現後臺多任務的效果了。

<code>vim command_address.page &/<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

上面顯示的是這個後臺進程的 ID 。

< 輸入重定向

許多 Linux 命令接受一個文件作為參數,並從該文件中獲取數據。這些命令中的大多數還可以從流中獲取輸入。要創建一個流,可以使用左尖括號 " ,如下將文件重定向到命令中:

<code>sort < words.txt/<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

上面將 words.txt 文件的內容並進行了排序。

注意:它是不顯示數據來源文件的文件名的。

<code>wc words.txt/<code>
<code>wc < words.txt/<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

> 輸出重定向

輸入和輸出是相反的,很好理解。用右尖括號 ">" 將命令的輸出重定向,通常是重定向到文件中

<code>ls > files.txt/<code>
<code>cat files.txt/<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

高端玩家還可以和數字一同使用:

<code>wc doesntexist.txt 2> errors.txt/<code>
<code>cat errors.txt/<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

這裡的 2 是一個文件描述符,表示標準錯誤(stderr)

大家感興趣的可以去搜索下文件描述符 stdin,stdout,stderr 是什麼?

| 連接命令

我們可以將 " | " 看成將命令鏈接在一起的管道。它從一個命令獲取輸出,並將其作為輸入送入下一個命令。管道命令的數量是任意的。

<code>cat words.txt | grep [cC] | sort -r/<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

解釋下,上面先使用 cat 將 words.txt 文件的內容輸入 grep , 然後 grep 提取包含小寫或大寫(C/c)的任何行,接著 grep 將這些行傳遞給 sort ,最後 sort 進行 -r 反向排序。

! 邏輯非

這跟編程語言中的 " ! " 差不多,我們直接拿個例子來說吧:

<code>[ ! -d ./backup ] && mkdir ./backup/<code>

第一個命令 -d 判斷當前目錄是否存在 backup 的目錄文件,外面加個邏輯非 ! 判斷,
第二個命令是創建 backup 目錄文件,
中間的 && 上面說過。
總的來說就是當 backup 目錄不存在時,創建 backup 目錄;當不存在時則不執行第二條命令。

不妨看下文件夾的備份狀態:

<code>ls -l -d backup/<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

" ! " 的另一個用法就是重新運行歷史命令:

<code>!24/<code>
<code>!!/<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

" !! " 是重新運行上一條命令的意思。

$ 變量表達式

"$" 開頭通常表示變量,下面是一些系統變量:

<code>echo $USER/<code>
<code>echo $HOME/<code>
<code>echo $PATH/<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

當然,你也可以自己定義變量然後輸出:

<code>ThisDistro=Ubuntu/<code>
<code>MyNumber=2001/<code>
<code>echo $ThisDistro/<code>
<code>echo $MyNumber/<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

我們還可以通過 "{}" 解鎖更高級的玩法:

先定義一個變量 MyString 並給它賦值 123456qwerty

<code>MyString=123456qwerty/<code>

正常輸出

<code>echo ${MyString}/<code>

加個

":6" 返回從索引位置 6 開始的一直到最後的字符串

<code>echo ${MyString:6}/<code>

顯示從索引位置從 0 開始往後 6 個字符的字符串

<code>echo ${MyString:0:6}/<code>

顯示從索引位置從 4 開始往後 4 個字符的字符串

<code>echo ${MyString:4:4}/<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

引用特殊字符

說了那麼多,那麼就有個問題了,就是我只想在命令裡面將這些特殊字符作為一般的符號顯示怎麼辦?這種我們稱之為引用,Linux 中有三種引用方法。

用雙引號 "" 括起來,不過這對 "$" 無效。

<code>echo "Today is $(date)"/<code>

用單引號 '' 括起來,停止所有特殊字符的功能

<code>echo 'Today is $(date)'/<code>

反斜槓 \\ 轉義,這在很多場合都有通用的。

<code>echo "Today is \\$(date)"/<code>
收藏 | 15 個你非瞭解不可的 Linux 特殊字符

今天的科普文章有點長,大家慢慢消化哈。


分享到:


相關文章: