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