linux bash變數作用域
一,思考一個問題,當在shell里執行某個程式時,shell是怎么找到這個程式的?
shell會去$PATH環境變數定義的目錄里去找這個命令,環境變數里一般包括/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin這么多目錄,這些目錄下又有上千個程式,從這么多目錄里的,這么多程式里查找肯定是花費時間的,shell為了提高查找效率,使用了快取機制,這個機制叫hash,,
有了hash快取后,shell先去hash里查找,如果找到了,就使用;如果沒有找到,才去$PATH環境變數定義的目錄里去找,找到后,把命令的路勁加程式名放入hash中,
注意:如果是shell的buildin命令,不會放入hash,
-
hash命令用法:
-
查看hash里都快取了哪些程式:
hashhits:代表此命令,被命中了幾次,
# hash hits command 1 /usr/bin/cat 2 /usr/bin/ls -
詳細查看hash里都快取了哪些程式:
hash -l# hash -l builtin hash -p /usr/bin/cat cat builtin hash -p /usr/bin/ls ls -
清除某個快取:
hash -d cat# hash -d cat # hash hits command 2 /usr/bin/ls -
清除所有快取:
hash -r# hash -r # hash hash: hash table empty -
為什么還要清除快取?理由:當把命令移動到別的目錄后,用原來的快取就找不到命令了,shell會報出錯誤,所有要清除,
-
二,bash變數的作用域
-
shell行程的子孫行程,
在shell行程里又啟動了別的shell行程,下面的例子是在bash里又啟動了一個bash,讓后在新啟動的bash里,又啟動了一個csh,
# pstree systemd─┬ ├─sshd───sshd───bash───pstree # bash # csh # pstree systemd─┬ ├sshd───sshd───bash───bash───csh───pstree -
bash變數種類:
-
按變數的作用域范圍分為:
-
本地變數:作用域僅為當前shell行程
驗證本地變數的作用域:
# firstName=jerry # echo $firstName jerry # csh # echo $firstName firstName: Undefined variable. # exit exit # echo $firstName jerry-
賦值:name=value
-
參考:${name},$name
- "":變數會被替換成其值
- '':變數不會被替換成其值
-
查看變數:set
-
撤銷變數:unset name,注意name前不要加$
# firstname=tom # echo $firstname tom # unset firstname # echo $firstname
-
-
環境變數:作用域為當前shell行程,及其子孫shell行程,
驗證環境變數的作用域:
# fn=tom # echo $fn tom # export fn # csh # echo $fn tom # exit exit # echo $fn tom-
賦值:
-
export name=value
-
name=value
export name
-
declare -x name=value
-
name=value
declare -x name
-
-
參考:同本地變數,
-
撤銷變數:unset name,注意name前不要加$
-
bash內嵌的環境變數:
PATH,HISTORY,HISTSIZE,HISTFILESIZE,HISTCONTROL,SHELL,HOME,UID,PWD,OLDPWD -
查看環境變數命令:
export,declare -x,printenv,env
-
-
只讀變數(常量):作用域是當前shell行程,且不可以撤銷,隨當前shell行程的終止而終止,
- declare -r name
- readonly name
檢證常量的作用域:
# la=foo # declare -r la # echo $la foo # csh # $echo la echo: Undefined variable. # exit exit # echo $la foo # la=aa -bash: la: readonly variable [root@localhost ~]# unset la -bash: unset: la: cannot unset: readonly variable- 區域變數:函式里的變數,作用域僅為函式內,
-
位置引數變數:shell腳本的引數
-
特殊變數:
- $?:上一個命令的執行結果,0:成功;1-255:失敗,
- ...
-
-
bash里,多個命令一起執行
-
多個命令連續執行:
command1;command2;command3...這些命令都會被執行,
-
多個命令邏輯連續執行
根據前面命令的執行結果(成功或者失敗),決定是否執行后面的命令,
-
前一個命令執行成功后,后面的命令才讓執行:
&&例子:先查看目錄存不存在,存在了才進入此目錄
# pwd /root # ls /sdf && cd /tmp ls: cannot access /sdf: No such file or directory # pwd /root # ls /sdf || cd /tmp ls: cannot access /sdf: No such file or directory # pwd /tmp -
前一個命令執行失敗后,后面的命令才讓執行:
||例子:先某個用戶存不存在,不存在則創建此用戶;存在了就不創建了,
# pwd /root # ls /sdf || cd /tmp ls: cannot access /sdf: No such file or directory # pwd /tmp
-
-
三,如何執行shell腳本檔案
1,用chmod賦予shell檔案可執行權限,
./shell.sh
2,把shell檔案(這個檔案不需要有執行權限)作為引數,傳給bash程式,
bash shell.sh
-
練習1
1,顯示/etc目錄下所有以p(不區分大小寫)開頭的檔案或者目錄本身,
2,顯示/var目錄下的所有檔案或目錄,并將顯示結果中的小寫字母轉換為大寫后顯示
3,創建臨時檔案/tmp/myfile.XXXX
#!/bin/bash ls -ld /etc/p* ls -d /var/* | tr 'a-z' 'A-Z' mktemp /tmp/myfile.XXXX
四,bash組態檔
1,啟動shell行程的種類:
- 互動方式啟動的shell行程
- 直接通過終端輸入賬號密碼后登錄后,啟動的shell行程
- 使用su命令:
su - username,或者使用su-l username,登錄后,啟動的shell行程
- 非互動方式啟動的shell行程
- 使用su命令:
su username,登錄后,啟動的shell行程 - 在gnome或者kde下打開終端后,啟動的shell行程
- 執行shell腳本檔案時,啟動的shell行程
- 使用su命令:
2,bash組態檔的種類
-
profile類
-
對所有用戶都有效,只有管理員才可以修改下面的組態檔
- /etc/profile
- /etc/profile.d/*.sh
-
僅對當前用戶有效
~/.bash_profile
-
功用:
- 用于定義環境變數
- 運行命令或腳本
-
-
bashrc類
-
對所有用戶都有效,只有管理員才可以修改下面的組態檔
/etc/bashrc
-
僅對當前用戶有效
~/.bashrc
-
功用:
- 定義本地變數
- 定義命令別名
-
3,bash組態檔的加載順序,
-
互動方式啟動的shell行程
/etc/profile--->/etc/profile.d/*.sh--->/.bash_profile--->/.bashrc--->/etc/bashrc
-
非互動方式啟動的shell行程
~/.bashrc--->/etc/bashrc--->/etc/profile.d/*.sh
4,重新加載組態檔
- 當修改組態檔后,是不會立即生效的
- 使用
source 配置名,讓修改的配置立即生效
五,用emacs撰寫shell腳本
1,自動補全的快捷鍵:ESC TAB
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/146246.html
標籤:Linux
下一篇:conda pip 安裝 dgl 并運行demo 出現:Segmentation fault (core dumped) 錯誤
