linux bash變量做用域linux
shell會去$PATH環境變量定義的目錄裏去找這個命令。環境變量裏通常包括/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
這麼多目錄,這些目錄下又有上千個程序,從這麼多目錄裏的,這麼多程序裏查找確定是花費時間的。shell爲了提升查找效率,使用了緩存機制,這個機制叫hash
。。c++
有了hash緩存後,shell先去hash裏查找,若是找到了,就使用;若是沒有找到,纔去$PATH環境變量定義的目錄裏去找,找到後,把命令的路勁加程序名放入hash中。shell
注意:若是是shell的buildin命令,不會放入hash。緩存
hash命令用法:bash
查看hash裏都緩存了哪些程序:hash
微信
hits:表明此命令,被命中了幾回。ssh
# 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
ui
# hash -r # hash hash: hash table empty
爲何還要清除緩存?理由:當把命令移動到別的目錄後,用原來的緩存就找不到命令了,shell會報出錯誤,全部要清除。
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進程的終止而終止。
檢證常量的做用域:
# 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腳本的參數
特殊變量:
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
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
1,啓動shell進程的種類:
su - username
,或者使用su-l username
,登陸後,啓動的shell進程su username
,登陸後,啓動的shell進程2,bash配置文件的種類
profile類
對全部用戶都有效,只有管理員才能夠修改下面的配置文件
僅對當前用戶有效
~/.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 配置名
,讓修改的配置當即生效1,自動補全的快捷鍵:ESC TAB