環境變數與檔案查詢

2puT發表於2016-07-26
環境變數與檔案查詢 - 實驗樓
https://www.shiyanlou.com/courses/document/60
環境變數與檔案查詢
實驗介紹
本節實驗介紹環境變數的作用與用法,及幾種搜尋檔案的方法。學會
這些技巧高效地使用 Linux。
一、環境變數
1.變數
要解釋環境變數,得先明白變數是什麼,準確的說應該是 Shell 變數,
所謂變數就是計算機中用於記錄一個值(不一定是數值,也可以是字
符或字串)的符號,而這些符號將用於不同的運算處理中。通常變
量與值是一對一的關係,可以通過表示式讀取它的值賦值給其它變
量,也可以直接指定數值賦值給任意變數。為了便於運算和處理,大
部分的程式語言會區分變數的型別,用於分別記錄數值、字元或者字
符串等等資料型別。Shell 中的變數也基本如此,有不同型別(但不用
專門指定型別名),可以參與運算,有作用域限定。
變數的作用域即變數的有效範圍(比如一個函式中、一個源文
件中或者全域性範圍),在該範圍內只能有一個同名變數。一旦
離開則該變數無效,如同不存在這個變數一般。
在 Shell 中如何建立一個變數,如何給變數賦值和如何讀取變數的值
呢?這部分內容會在bash 指令碼程式設計 (http://www.shiyanlou.com
/courses/5)這門課中詳細介紹,這裡我簡單舉例說明一下:
使用 declare 命令建立一個變數名為 tmp 的變數:
$ declare tmp
其實也可以不用 declare 預宣告一個變數,直接即用即建立,
這裡只是告訴你 declare 的作用,這在建立其它指定型別的變
量(如陣列)時會用到。
使用 = 號賦值運算子為變數 tmp 賦值為 shiyanlou:
1 of 12
08/17/2015 07:13 PM環境變數與檔案查詢 - 實驗樓
https://www.shiyanlou.com/courses/document/60
$ tmp=shiyanlou
讀取變數的值,使用 echo 命令和 $ 符號($符號用於表示引用一個變
量的值,初學者經常會忘記輸入):
$ echo $tmp
注意:關於變數名,並不是任何形式的變數名都是可用的,變數名只能
是英文字母,數字或者下劃線,且不能以數字作為開頭。
2.環境變數
簡單理解了變數的概念,就很好解釋環境變數了,環境變數就是作用
域比自定義變數要大,如Shell 的環境變數作用於自身和它的子程式。
在所有的 UNIX 和類 UNIX 系統中,每個程式都有其各自的環境變數
設定,且預設情況下,當一個程式被建立時,處理建立過程中明確指
定的話,它將繼承其父程式的絕大部分環境設定。Shell 程式也作為一
個程式執行在作業系統之上,而我們在 Shell中執行的大部分命令都將
以 Shell 的子程式的方式執行。
通常我們會涉及到的環境變數有三種:
當前 Shell 程式私有使用者自定義變數,如上面我們建立的 temp
變數,只在當前 Shell 中有效。
Shell 本身內建的變數。
從自定義變數匯出的環境變數。
也有三個與上述三種環境變數相關的命令, set , env , export 。
這三個命令很相似,都可以用於列印相關環境變數,區別在於涉及的是
不同範圍的環境變數,詳見下表:
命令
set
env
2 of 12
說明
顯示當前 Shell 所有環境變數,包括其內建環境變數(與 Shell 外觀等相
關),使用者自定義變數及匯出的環境變數
顯示與當前使用者相關的環境變數,還可以讓命令在指定環境中執行
08/17/2015 07:13 PM環境變數與檔案查詢 - 實驗樓
https://www.shiyanlou.com/courses/document/60
命令
說明
顯示從 Shell 中匯出成環境變數的變數,也能通過它將自定義變數匯出為環境
export
變數
你可以更直觀的使用 vimdiff 工具比較一下它們之間的差別:
$ temp=shiyanlou
$ export temp_env=shiyanlou
$ env|sort>env.txt
$ export |sort> export .txt
$ set |sort> set .txt
上述操作將命令輸出通過管道 | 使用 sort 命令排序,再重定向到物件
文字檔案中。
$ vimdiff env.txt export .txt set .txt
使用 vimdiff 工具比較匯出的幾個檔案的內容。
3 of 12
08/17/2015 07:13 PM環境變數與檔案查詢 - 實驗樓
https://www.shiyanlou.com/courses/document/60
關於環境變數,可以簡單的理解成在當前程式的子程式是否有效,有
效則為環境變數,否則不是(有些人也將所有變數統稱為環境變數,
只是以全域性環境變數和區域性環境變數進行區分,我們只要理解它們的
實質區別即可)。我們這裡用 export 命令來體會一下,先在 Shell 中
設定一個變數 temp=shiyanlou ,然後再新建立一個子 Shell 檢視
temp 變數的值:
注意:為了與普通變數區分,通常我們習慣將環境變數名設為大寫
3.命令的查詢路徑與順序
你可能很早之前就有疑問,我們在 Shell 中輸入一個命令,Shell 是怎
麼知道在哪去找到這個命令然後執行的呢?這是通過環境變數 PATH 來
進行搜尋的,熟悉 Windows 的使用者可能知道 Windows 中的也是有這
麼一個 PATH 環境變數。這個 PATH 裡面就儲存了Shell中執行的命令
的搜尋路徑。
檢視 PATH 環境變數的內容:
$ echo $PATH
預設情況下你會看到如下輸出:
/usr/local/sbin: /usr/ local/bin: /usr/ sbin: /usr/ bin:
/sbin:/ bin: /usr/g ames: /usr/ local/games
如果你還記得我們在 Linux 目錄結構那一節的內容,你就應該知道上
面這些目錄下放的是哪一類檔案了。通常這一類目錄下放的都是可執
行檔案,當我們在 Shell 中執行一個命令時,系統就會按照 PATH 中
設定的路徑按照順序依次到目錄中去查詢,如果存在同名的命令,則
執行先找到的那個。
4 of 12
08/17/2015 07:13 PM環境變數與檔案查詢 - 實驗樓
https://www.shiyanlou.com/courses/document/60
下面我們將練習建立一個最簡單的可執行 Shell 指令碼和一個使
用 C 語言建立的"hello world"程式,如果這兩部分內容你之前
沒有學習過,那麼你可以進行一個入門學習: C 語言入門教程
(http://www.shiyanlou.com/courses/57) 高階 Bash 指令碼程式設計指
南 (http://www.shiyanlou.com/courses/5) Linux Shell Scripting
Tutorial (LSST) v2.0 (http://bash.cyberciti.biz/guide
/Main_Page)
建立一個 Shell 指令碼檔案:
$ vim hello_shell.sh
在指令碼中新增如下內容,儲存並退出(注意不要省掉第一行,這不是
註釋,論壇有使用者反應會有語法錯誤,就是因為沒有了第一行):
#!/bin/zsh
for ((i= 0 ; i< 10 ; i++)); do
echo "hello shell"
done
exit 0
為檔案新增可執行許可權:
$ chmod 755 hello_shell.sh
執行指令碼
$ ./hello_shell.sh
建立一個 C 語言"hello world"程式:
$ vim hello_world.c
5 of 12
08/17/2015 07:13 PM環境變數與檔案查詢 - 實驗樓
https://www.shiyanlou.com/courses/document/60
#include <stdio.h>
int main(void)
{
printf ( "hello world!\n" );
return 0 ;
}
使用 gcc 生成可執行檔案:
$ gcc -o hello_world hello_world.c
gcc 生成二進位制檔案預設具有可執行許可權,不需要修改
在 shiyanlou 家目錄建立一個 mybin 目錄,並將上述 hello_shell.sh
和 hello_world 檔案移動到其中:
$ mkdir mybin
$ mv hello_shell.sh hello_world mybin/
現在你可以在 mybin 目錄中分別執行你剛剛建立的兩個程式:
$ cd mybin
$ ./hello_shell.sh
$ ./hello_world
回到上一級目錄,也就是 shiyanlou 家目錄,當再想執行那兩個程式
時,會發現提示命令找不到,除非加上命令的完整路徑,但那樣很不
方便,如何做到想使用系統命令一樣執行自己建立的指令碼檔案或者程
序呢?那就要將命令所在路徑新增到 PATH 環境變數了。
4.新增自定義路徑到“PATH”環境變數
6 of 12
08/17/2015 07:13 PM環境變數與檔案查詢 - 實驗樓
https://www.shiyanlou.com/courses/document/60
在前面我們應該注意到 PATH 裡面的路徑是以 : 作為分割符,所以我
們可以這樣新增自定義路徑:
$ PATH = $PATH:/home/shiyanlou/mybin
注意這裡一定要使用絕對路徑
現在你就可以在其他任意目錄執行那兩個命令了。你可能會意識到這
樣還並沒有很好的解決問題,因為我給 PATH 環境變數追加了一個路
徑,它也只是在當前 Shell 有效,我一旦退出終端,再開啟就會發現又
失效了。有沒有方法讓新增的環境變數全域性有效?或者每次啟動 Shell
時自動執行上面新增自定義路徑到 PATH 的命令?下面我們就來說說
後一種方式——讓它自動執行。
在每個使用者的 home 目錄中有一個 Shell 每次啟動時會預設執行一個
配置指令碼,以初始化環境,包括新增一些使用者自定義環境變數等等。
zsh 的配置檔案是 .zshrc ,相應 Bash 的配置檔案為 .bashrc 。它
們在 etc 下還都有一個或多個全域性的配置檔案,不過我們一般只修改
使用者目錄下的配置檔案。
我們可以簡單的使用下面命令直接新增內容到 .zshrc 中:
$ echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zs
hrc
上述命令中 >> 表示將標準輸出以追加的方式重定向到一個檔案中,注
意前面用到的 > 是以覆蓋的方式重定向到一個檔案中,使用的時候一
定要注意分辨。在指定檔案不存在的情況下都會建立新的檔案。
5.修改和刪除已有變數
變數修改
變數的修改有以下幾種方式:
變數設定方式
${變數名#匹配字串} 說明
從頭向後開始匹配,刪除符合匹配字串的最短資料
${變數名##匹配字串} 從頭向後開始匹配,刪除符合匹配字串的最長資料
${變數名%匹配字串} 從尾向前開始匹配,刪除符合匹配字串的最短資料
${變數名%%匹配字串} 從尾向前開始匹配,刪除符合匹配字串的最長資料
${變數名/舊的字串/新的字串} 將符合舊字串的第一個字串替換為新的字串
${變數名//舊的字串/新的字串} 將符合舊字串的全部字串替換為新的字串
比如要修改我們前面新增到 PATH 的環境變數。為了避免操作失誤導
致命令找不到,我們先將 PATH 賦值給一個新的自定義變數 path:
7 of 12
08/17/2015 07:13 PM環境變數與檔案查詢 - 實驗樓
https://www.shiyanlou.com/courses/document/60
$ path= $PATH
$ echo $path
$ path= ${path%/home/shiyanlou/mybin}
# 或使用萬用字元,*表示任意多個任意字元
$ path= ${path%*/mybin}
變數刪除
可以使用 unset 命令刪除一個環境變數:
$ unset temp
6.如何讓環境變數立即生效
在上面我們在 Shell 中修改了一個配置指令碼檔案之後(比如 zsh 的配
置檔案 home 目錄下的 .zshrc ),每次都要退出終端重新開啟甚至
重啟主機之後其才能生效,很是麻煩,我們可以使用 source 命令來讓
其立即生效,如:
$ source .zshrc
source 命令還有一個別名就是 . ,注意與表示當前路徑的那個點區
分開,雖然形式一樣,但作用和使用方式一樣,上面的命令如果替換
成 . 的方式就該是
$ . ./.zshrc
注意第一個點後面有一個空格,而且後面的檔案必須指定完整的絕對
或相對路徑名,source 則不需要。
二、搜尋檔案
與搜尋相關的命令常用的有如下幾個
whereis , which , find , locate 。
whereis 簡單快速
$whereis who
你會看到它找到了三個路徑,兩個可執行檔案路徑和一個 man 線上幫
助檔案所在路徑,這個搜尋很快,因為它並沒有從硬碟中依次查詢,
8 of 12
08/17/2015 07:13 PM環境變數與檔案查詢 - 實驗樓
https://www.shiyanlou.com/courses/document/60
而是直接從資料庫中查詢。 whereis 只能搜尋二進位制檔案(-b),man
幫助檔案(-m)和原始碼檔案(-s)。如果想要獲得更全面的搜尋結果可以
使用 locate 命令。
locate 快而全
通過"/var/lib/mlocate/mlocate.db"資料庫查詢,不過這個資料庫也不是
實時更新的,系統會使用定時任務每天自動執行 updatedb 命令更新
一次,所以有時候你剛新增的檔案,它可能會找不到,需要手動執行
一次 updatedb 命令(在我們的環境中必須先執行一次該命令)。它
可以用來查詢指定目錄下的不同檔案型別,如查詢 /etc 下所有以 sh 開
頭的檔案:
$ locate /etc/sh
注意,它不只是在 etc 目錄下查詢並會自動遞迴子目錄進行查詢
查詢 /usr/share/ 下所有 jpg 檔案:
$ locate /usr/share/ \*.jpg
注意要新增 * 號前面的反斜槓轉義,否則會無法找到
如果想只統計數目可以加上 -c 引數, -i 引數可以忽略大小寫進行查
找,whereis 的 -b , -m , -s 同樣可以是使用。
which 小而精
which 本身是 Shell 內建的一個命令,我們通常使用 which 來確定是
否安裝了某個指定的軟體,因為它只從 PATH 環境變數指定的路徑中去
搜尋命令:
$ which man
find 精而細
find 應該是這幾個命令中最強大的了,它不但可以通過檔案型別、文
件名進行查詢而且可以根據檔案的屬性(如檔案的時間戳,檔案的權
限等)進行搜尋。 find 命令強大到,要把它將明白至少需要單獨好幾
節課程才行,我們這裡只介紹一些常用的內容。
在指定目錄下搜尋指定檔名的檔案:
9 of 12
08/17/2015 07:13 PM環境變數與檔案查詢 - 實驗樓
https://www.shiyanlou.com/courses/document/60
$ find /etc/ -name interfaces
注意 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還要新的文
件名
列出 home 目錄中,當天(24 小時之內)有改動的檔案:
$ find ~ -mtime 0
列出使用者家目錄下比Code資料夾新的檔案:
$ find ~ -newer /home/shiyanlou/ Code
作業
《黑客帝國》電影裡滿螢幕程式碼的“數字雨”,在 Linux 裡面你也可以輕
鬆實現這樣的效果,你只需要一個命令 cmatrix 。
需要先安裝,因為 Ubuntu 沒有預裝:
10 of 12
08/17/2015 07:13 PM環境變數與檔案查詢 - 實驗樓
https://www.shiyanlou.com/courses/document/60
$ sudo apt-get update; sudo apt-get install cmatrix
裝好之後先不要急著執行,為了看到更好的效果,我們需要先修改終
端的主題配色,修改為黑底綠字,修改方法見下圖:
然後按下 F11 可以全屏顯示。
動手做實驗,輕鬆學IT。
實驗樓-通過動手實踐的方式學會IT技術。
公司簡介 (/aboutus) 聯絡我們 (/contact) 常見問題 (/faq#howtostart) 加入我們 (/hire) 隱私協議 (/privacy)
會員條款 (/terms)
站長統計 (http://www.cnzz.com/stat/website.php?web_id=5902315)
蜀ICP備13019762號 (http://www.miibeian.gov.cn/)
(http://www.anquan.org/authenticate/cert/?site=www.shiyanlou.com&at=realname)
QQ群
11 of 12
08/17/2015 07:13 PM環境變數與檔案查詢 - 實驗樓
https://www.shiyanlou.com/courses/document/60
微信
微博
(http://weibo.com/shiyanlou2013)
12 of 12
08/17/2015 07:13 PM

相關文章