環境變數與檔案查詢
SHELL變數
計算機中用於記錄一個值(不一定是數值,也可以是字元或字串)的符號,而這些符號將用於不同的運算處理中。變數的作用域即變數的有效範圍(比如一個函式中、一個原始檔中或者全域性範圍),在該範圍內只能有一個同名變數。一旦離開則該變數無效,如同不存在這個變數一般。
建立變數
在Linux系統中,我們可以使用 declare
命令來宣告一個變數。在這裡我們宣告一個變數名為tmp,並賦值為 shiyanlou。
注意:使用 =
號賦值運算子,將變數 tmp 賦值為 shiyanlou。注意,與其他語言不同的是, Shell 中的賦值操作,=
兩邊不可以輸入空格,否則會報錯。
通常我們會涉及到的變數型別有三種:
- 當前 Shell 程式私有使用者自定義變數,如上面我們建立的 tmp 變數,只在當前 Shell 中有效。
- Shell 本身內建的變數。
- 從自定義變數匯出的環境變數。
環境變數的作用域比自定義變數的要大,如 Shell 的環境變數作用於自身和它的子程式。在所有的 UNIX 和類 UNIX 系統中,每個程式都有其各自的環境變數設定,且預設情況下,當一個程式被建立時,除了建立過程中明確指定的話,它將繼承其父程式的絕大部分環境設定。
也有三個與上述三種環境變數相關的命令:set
,env
,export
。這三個命令很相似,都是用於列印環境變數資訊,區別在於涉及的變數範圍不同。詳見下表:
命 令 | 說 明 |
---|---|
set |
顯示當前 Shell 所有變數,包括其內建環境變數(與 Shell 外觀等相關),使用者自定義變數及匯出的環境變數。 |
env |
顯示與當前使用者相關的環境變數,還可以讓命令在指定環境中執行。 |
export |
顯示從 Shell 中匯出成環境變數的變數,也能通過它將自定義變數匯出為環境變數。 |
修改變數
變數的修改有以下幾種方式:
變數設定方式 | 說明 |
---|---|
${變數名#匹配字串} |
從頭向後開始匹配,刪除符合匹配字串的最短資料 |
${變數名##匹配字串} |
從頭向後開始匹配,刪除符合匹配字串的最長資料 |
${變數名%匹配字串} |
從尾向前開始匹配,刪除符合匹配字串的最短資料 |
${變數名%%匹配字串} |
從尾向前開始匹配,刪除符合匹配字串的最長資料 |
${變數名/舊的字串/新的字串} |
將符合舊字串的第一個字串替換為新的字串 |
${變數名//舊的字串/新的字串} |
將符合舊字串的全部字串替換為新的字串 |
可以看到,路徑中匹配到 /bin 的字元都已經沒有了。
刪除變數
可以使用 unset
命令刪除一個環境變數:
搜尋檔案
與搜尋相關的命令常用的有 whereis
,which
,find
和 locate
。
whereis
簡單快速
注意: whereis
只能搜尋二進位制檔案(-b)、幫助檔案(-m)和原始碼檔案(-s)。
locate
快而全
使用 locate
命令查詢檔案也不會遍歷硬碟,它通過查詢 /var/lib/mlocate/mlocate.db
資料庫來檢索資訊。不過這個資料庫也不是實時更新的,系統會使用定時任務每天自動執行 updatedb
命令來更新資料庫。所以有時候你剛新增的檔案,它可能會找不到,需要手動執行一次 updatedb
命令(在我們的環境中必須先執行一次該命令)。注意這個命令也不是內建的命令,例如在我們的環境中就需要手動安裝,然後執行更新。
$ sudo apt-get update
$ sudo apt-get install locate
$ sudo updatedb
$ locate /etc/sh
他也可以使用正則來匹配檔案。在使用*
號時要加反斜杆 \
。如果想只統計數目可以加上 -c 引數,-i 引數可以忽略大小寫進行查詢,whereis 的 -b、-m、-s 同樣可以使用。
which
小而精
which
本身是 Shell 內建的一個命令,我們通常使用 which
來確定是否安裝了某個指定的程式,因為它只從 PATH
環境變數指定的路徑中去搜尋命令並且返回第一個搜尋到的結果。也就是說,我們可以看到某個系統命令是否存在以及執行的到底是哪一個地方的命令。
find
精而細
$ find [path] [option] [action]
與時間相關的命令引數:
引數 | 說明 |
---|---|
-atime |
最後訪問時間 |
-ctime |
最後修改檔案內容的時間 |
-mtime |
最後修改檔案屬性的時間 |
下面以 -mtime
引數舉例:
-mtime n
:n 為數字,表示為在 n 天之前的“一天之內”修改過的檔案-mtime +n
:列出在 n 天之前(不包含 n 天本身)被修改過的檔案-mtime -n
:列出在 n 天之內(包含 n 天本身)被修改過的檔案-newer file
:file 為一個已存在的檔案,列出比 file 還要新的檔名
本作品採用《CC 協議》,轉載必須註明作者和本文連結