不知道大家接觸 Linux 系統有多久了,可曾瞭解過 Linux 中有哪些特殊的字符呢?其實啊,那些特殊字符都大有用處呢,今天的文章就給大家簡單地科普一下 Linux 中你需要了解的 15 個特殊字符,想學或剛學 Linux 的小夥伴趕緊上車了為!
~ 主目錄
這個波浪號 ~ 指的是主目錄,也就是我們用戶的個人目錄,無論你身在何方,輸入 cd ~ 它將帶你回家!
<code>cd ~/<code>
更高端的玩法就是在它後面加上具體的路徑,直接定位到家目錄中的指定位置,是不是很方便呢?
<code>cd ~/work/archive/<code>
. 當前目錄
英文句號 . 代表當前目錄,我們來看一下當前目錄下的全部文件:
<code>ls -al/<code>
紅圈裡的 . 就是指當前目錄,不過這沒什麼意義,我們更多的是在命令中使用它,如下:
<code>./script.sh/<code>
這樣做是在告訴 bash 只要在當前目錄中查找並執行>
.. 父目錄
兩個英文句號 .. 代表父目錄,也就是當前目錄的上一級目錄。假設我們要回到上一級目錄:
<code>cd ../<code>
跟前面一樣,你可以在它後面加具體的目錄,這裡的意思就是定位到與當前目錄同級的其它目錄:
<code>cd ../projects//<code>
/ 路徑目錄分隔符
斜槓 "/" 指的是路徑目錄分隔符,這裡沒什麼好說的。
<code>ls ~/work/tests//<code>
但是,有意思的是,如果 / 路徑目錄分隔符前面沒有東西的話,是不是就是意味著這是最上級的目錄了?由於 Linux 系統的目錄樹均始於
/ ,所以僅僅一個 / 代表了我們常說的系統根目錄。<code>cd //<code>
# 註釋
以 # 開頭,代表這句話是註釋。
<code># This will be ignored by the Bash shell/<code>
雖然上面那段話就被忽略了,但它還是會添加到您的命令歷史記錄中。
更厲害的做法如下:
先定義一個變量並給它賦值字符串 “amazing alvin”
<code>this_string="amazing alvin"/<code>
${this_string#amazing} 返回的是被註釋掉 amazing 的 this_string 字符串變量,可以 echo 輸出看下結果:
<code>echo awsome ${this_string#amazing}/<code>
amazing 只是被註釋掉而已,它並未被刪除,去掉註釋它就回來了:
<code>echo $this_string/<code>
? 單字符通配符
問號 "?",指的是單字符通配符。Bash Shell 支持三種通配符。
它代表文件名中
任意一個字符的匹配,例如:<code>ls badge?.txt/<code>
注意,它與 badge.txt 是不匹配滴,因為 badge 後面沒有字符。
正因為 "?" 匹配單個字符,所以這裡有個看似很厲害的玩法,就是你想要的找的文件的文件名有多少個字符,你就輸入多少個
"?" 。<code>ls ?????.txt/<code>
看著挺厲害,不過我怎麼感覺這好彆扭?????
* 字符序列通配符
星號 * 代表的是任意字符序列,匹配任意字符,包括空字符 ,以剛才的 badge 為例:
<code>ls badge*/<code>
可以看到,badge.txt 都匹配到了。
匹配任意類型的文件:
<code>ls source.*/<code>
[] 字符集通配符
方括號 "[]" 指的是字符集通配符,文件名中的相關字符必須與字符集中的至少一個字符匹配。通過例子來體會一下它的作用吧:
<code>ls badge_0[246].txt/<code>
<code>ls badge_[01][789].txt/<code>
<code>ls badge_[23][1-5].txt/<code>
; 命令分隔符
這跟我們日常使用的 ";" 差不多,就不細說了,主要是用來分隔命令的。
<code>ls > count.txt; wc -l count.txt; rm count.txt/<code>
這裡注意,用 ; 分隔命令時,即使第一個命令失敗,第二個命令也會運行,即使第二個命令失敗,第三個命令也會運行,依此類推。
如果要在一個命令失敗的情況下就停止,請使用 "&&" ,如下:
<code>cd ./doesntexist && cp ~/Documents/reports/* ./<code>
& 後臺處理
有時候在終端正在運行一個命令時,例如 vim,你想運行另外一個命令怎麼辦?這裡有個小技巧就是在命令後面加一個 "&" 符號,將這個程序放在後臺啟動,這樣你就能在終端實現後臺多任務的效果了。
<code>vim command_address.page &/<code>
上面顯示的是這個後臺進程的 ID 。
< 輸入重定向
許多 Linux 命令接受一個文件作為參數,並從該文件中獲取數據。這些命令中的大多數還可以從流中獲取輸入。要創建一個流,可以使用左尖括號 " ,如下將文件重定向到命令中:
<code>sort < words.txt/<code>
上面將 words.txt 文件的內容並進行了排序。
注意:它是不顯示數據來源文件的文件名的。
<code>wc words.txt/<code>
<code>wc < words.txt/<code>
> 輸出重定向
輸入和輸出是相反的,很好理解。用右尖括號 ">" 將命令的輸出重定向,通常是重定向到文件中。
<code>ls > files.txt/<code>
<code>cat files.txt/<code>
高端玩家還可以和數字一同使用:
<code>wc doesntexist.txt 2> errors.txt/<code>
<code>cat errors.txt/<code>
這裡的 2 是一個文件描述符,表示標準錯誤(stderr)
大家感興趣的可以去搜索下文件描述符 stdin,stdout,stderr 是什麼?
| 連接命令
我們可以將 " | " 看成將命令鏈接在一起的管道。它從一個命令獲取輸出,並將其作為輸入送入下一個命令。管道命令的數量是任意的。
<code>cat words.txt | grep [cC] | sort -r/<code>
解釋下,上面先使用 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>
" ! " 的另一個用法就是重新運行歷史命令:
<code>!24/<code>
<code>!!/<code>
" !! " 是重新運行上一條命令的意思。
$ 變量表達式
"$" 開頭通常表示變量,下面是一些系統變量:
<code>echo $USER/<code>
<code>echo $HOME/<code>
<code>echo $PATH/<code>
當然,你也可以自己定義變量然後輸出:
<code>ThisDistro=Ubuntu/<code>
<code>MyNumber=2001/<code>
<code>echo $ThisDistro/<code>
<code>echo $MyNumber/<code>
我們還可以通過 "{}" 解鎖更高級的玩法:
先定義一個變量 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>
引用特殊字符
說了那麼多,那麼就有個問題了,就是我只想在命令裡面將這些特殊字符作為一般的符號顯示怎麼辦?這種我們稱之為引用,Linux 中有三種引用方法。
用雙引號 "" 括起來,不過這對 "$" 無效。
<code>echo "Today is $(date)"/<code>
用單引號 '' 括起來,停止所有特殊字符的功能。
<code>echo 'Today is $(date)'/<code>
反斜槓 \\ 轉義,這在很多場合都有通用的。
<code>echo "Today is \\$(date)"/<code>
今天的科普文章有點長,大家慢慢消化哈。
閱讀更多 良許Linux 的文章