shell 中的變量有不一樣類型,可參與運算,有做用域限定shell
變量的做用域即變量的有效範圍(好比一個函數中、一個源文件中或者全局範圍),在該範圍內只能有一個同名變量。一旦離開則該變量無效,如同不存在這個變量通常。數據庫
# 使用 declare 命令建立一個變量名爲 tmp 的變量 declare tmp tmp=hello echo $tmp
環境變量做用域比自定義變量要大,如 shell 的環境變量做用於自身和它的子進程。
在全部的 UNIX 和類 UNIX 系統中,每一個進程都有其各自的環境變量設置,且默認狀況下,當一個進程被建立時,處理建立過程當中明確指定的話,它將繼承其父進程的絕大部分環境設置。
Shell 程序也做爲一個進程運行在操做系統之上,而咱們在 Shell 中運行的大部分命令都將以 Shell 的子進程的方式運行。
一般咱們會涉及到的環境變量有三種:vim
也有三個與上述三種環境變量相關的命令 set,env,export,詳見下表:bash
命令 | 說明 |
---|---|
set | 顯示當前 Shell 全部環境變量,包括其內建環境變量(與 Shell 外觀等相關),用戶自定義變量及導出的環境變量 |
env | 顯示與當前用戶相關的環境變量,還可讓命令在指定環境變量 |
export | 顯示從 Shell 中導出成環境變量的變量,也能經過它將自定義變量導出爲環境變量 |
關於環境變量,能夠簡單的理解成在當前進程的子進程是否有效,有效則爲環境變量,不然不是。函數
tmp=hello echo $temp # 建立子 shell bash echo temp #值爲空表示該變量無效,退出子 shell exit export temp bash echo $temp
在 Shell 中輸入一個命令,Shell 是怎麼知道在哪去找到這個命令而後執行的呢?這是經過環境變量 PATH 來進行搜索的操作系統
#查看 PATH 環境變量的內容 echo $PATH
建立一個 SHELL 腳本文件:code
vim hello_shell.sh
在腳本中添加以下內容,保存並退出繼承
#!/bin/zsh for ((i=0; i<10; i++));do echo "hello shell" done exit 0
爲文件添加可執行權限:遞歸
chomd 755 hello_shell.sh
執行腳本進程
./ hello_shell.sh
建立一個 C 語言 hello world 程序:
vim hello_world.c
#include <stdio.h> int main(void) { printf("hello world!\n"); return 0; }
使用 gcc 生成可執行文件:
gcc -o hello_world hello_world.c
gcc 生成二進制文件默認具備可執行權限,不須要修改
在 home 目錄建立一個 test 目錄,並將上述 hello_shell.sh 和 hello_world 文件移動到其中:
mkdir test mv hello_shell.sh hello_world test/
如今你能夠在 test 目錄中分別運行你剛剛建立的兩個程序:
cd mybin ./hello_shell.sh ./hello_world
回到 home 目錄,再次運行那兩個程序時,會發現提示命令找不到
PATH=$PATH:/home/test
它也只是在當前 Shell 有效,我一旦退出終端,再打開就會發現又失效了。
在每一個用戶的 home 目錄中有一個 Shell 每次啓動時會默認執行一個配置腳本,以初始化環境,包括添加一些用戶自定義環境變量等等。zsh 的配置文件是.zshrc,相應 Bash 的配置文件爲 .bashrc。它們在 etc 下還都有一個或多個全局的配置文件,不過咱們通常只修改用戶目錄下的配置文件。
echo "PATH=$PATH:/home/test" >> .bashrc
變量的修改有如下幾種方式:
變量設置方式 | 說明 |
---|---|
${變量名#匹配字串} | 從頭向後開始匹配,刪除符合匹配字串的最短數據 |
${變量名##匹配字串} | 從頭向後開始匹配,刪除符合匹配字串的最長數據 |
${變量名%匹配字串} | 從尾向前開始匹配,刪除符合匹配字串的最短數據 |
${變量名%%匹配字串} | 從尾向前開始匹配,刪除符合匹配字串的最長數據 |
${變量名/舊的字串/新的字串} | 將符合舊字串的第一個字串替換爲新的字串 |
${變量名//舊的字串/新的字串} | 將符合舊字串的所有字串替換爲新的字串 |
path=$PATH echo $path path=${path%/home/test} # 或使用通配符,*表示任意多個任意字符 path=${path%*/test}
source .bashrc
與搜索相關的命令經常使用的有以下幾個 whereis,which,find,locate。
whereis who
whereis 只能搜索二進制文件 (-b),man 幫助文件 (-m) 和源代碼文件 (-s)。若是想要得到更全面的搜索結果可使用 locate 命令。
經過 "/var/lib/mlocate/mlocate.db" 數據庫查找,不過這個數據庫也不是實時更新的,系統會使用定時任務天天自動執行 updatedb 命令更新一次。
# 在 etc 目錄下查找並自動遞歸子目錄進行查找 locate /etc/sh # 查找 /usr/share/ 下全部 jpg 文件 locate /usr/share/\*.jpg
若是想只統計數目能夠加上 -c 參數,-i 參數能夠忽略大小寫進行查找,whereis 的 -b,-m,-s 一樣能夠是使用。
which man
find 應該是這幾個命令中最強大的了,它不但能夠經過文件類型、文件名進行查找並且能夠根據文件的屬性(如文件的時間戳,文件的權限等)進行搜索。
find /etc/ -name interfaces
注意 find 命令的路徑是做爲第一個參數的, 基本命令格式爲 find [path] [option] [action]
與時間相關的命令參數:
參數 | 說明 |
---|---|
-atime | 最後訪問時間 |
-ctime | 建立時間 |
-mtime | 最後修改時間 |
下面以 -mtime 參數舉例:
# 列出 home 目錄中,當天(24 小時以內)有改動的文件 find ~ -mtime 0 # 列出用戶家目錄下比 Code 文件夾新的文件 find ~ -newer /home/shiyanlou/Code