標籤:shell 變數介紹
[本文是自己學習所做筆記,歡迎轉載,但請註明出處:http://blog.csdn.net/jesson20121020]
今天來看一下Shell中的一些變數。
變數類型:
Shell中有以下幾種變數:
1) 本地變數
2) 環境變數
3) 位置變數
4) 標準變數
5) 特殊變數
1) 本地變數
本地變數在使用者現在的Shell生命週期的指令碼中使用。
用法: variable-name=value
set: 可以顯示本地所有的變數
注意,本地變數如果加上readonly,則該本地變數不能被修改,也就是說該變數僅僅是可讀的,另外,可以直接輸入readonly或readonly -p列印出所的的本地變數,例如:
[email protected]:~$ TIP="Hello World!"[email protected]:~$ set | grep TIPTIP='Hello World!'[email protected]:~$ echo $TIPHello World![email protected]:~$ echo ${TIP}}Hello World!}[email protected]:~$ TIP="hello world!"[email protected]:~$ echo $TIPhello world![email protected]:~$ readonly TIP[email protected]43SV:~$ TIP="hello shell!"bash: TIP: 唯讀變數[email protected]:~$ readonly declare -r BASHOPTS="checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath"declare -ir BASHPIDdeclare -r BASH_COMPLETION_COMPAT_DIR="/etc/bash_completion.d"declare -ar BASH_REMATCH='([0]="\${TIP" [1]="\${" [2]="TIP")'declare -ar BASH_VERSINFO='([0]="4" [1]="3" [2]="11" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")'declare -ir EUID="1000"declare -ir PPID="2162"declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor"declare -r TIP="hello world!"declare -ir UID="1000"[email protected]:~$ readonly -pdeclare -r BASHOPTS="checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath"declare -ir BASHPIDdeclare -r BASH_COMPLETION_COMPAT_DIR="/etc/bash_completion.d"declare -ar BASH_REMATCH='([0]="\${TIP" [1]="\${" [2]="TIP")'declare -ar BASH_VERSINFO='([0]="4" [1]="3" [2]="11" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")'declare -ir EUID="1000"declare -ir PPID="2162"declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor"declare -r TIP="hello world!"declare -ir UID="1000"
2) 環境變數
環境變數用於所有的使用者進程(通常稱為子進程),登入進程稱為父進程。Shell中執行的使用者進程均稱為子進程。本地變數僅用於本機使用者的進程,而環境變數則可用於所有的子進程,包括編輯器,指令碼和應用。
“export 變數” 可以將該變數設定為環境變數,另外,可以直接輸入export命令或env命令,就可以查看所有的環境變數,如:
[email protected]:~$ export NAME="jesson20121020"[email protected]:~$ env | grep NAMENAME=jesson20121020
3) 位置變數
在Shell中位置有變數有9個,即$1,...,$9,超過9個就要用其他的方式實現,參考以下指令碼:
parm.sh
#!/bin/bash#parmecho "指令碼的名稱:" $0echo "指令碼的第一個參數:" $1echo "指令碼的第二個參數:" $2echo "指令碼的第三個參數:" $3echo "指令碼的第四個參數:" $4echo "指令碼的第五個參數:" $5echo "指令碼的第六個參數:" $6echo "指令碼的第七個參數:" $7echo "指令碼的第八個參數:" $8echo "指令碼的第九個參數:" $9
運行以上指令碼得到:
[email protected]:~/develop/workspace/shell_workspace$ ./parm.sh A B C D E F G指令碼的名稱: ./parm指令碼的第一個參數: A指令碼的第二個參數: B指令碼的第三個參數: C指令碼的第四個參數: D指令碼的第五個參數: E指令碼的第六個參數: F指令碼的第七個參數: G指令碼的第八個參數:指令碼的第九個參數:
再看一個指令碼,實現按檔案名稱尋找目前的目錄下的檔案
searchfile.sh
#!/bin/bash#searchfilefind . -name $1 -print
如果我們要尋找目前的目錄下的parm.sh這個檔案,就可以這樣做:
[email protected]:~/develop/workspace/shell_workspace$ ./searchfile.sh parm.sh./parm.sh
可以看到,尋找到了,並列印出來了。
4) 標準變數
bash預設建立了一些標準的環境變數,可以在/etc/profile中定義,主要有EXINIT,HOME(家目錄),IFS(預設分隔符號),LOGNAME,MAIL,MAILCHECK(預設為60),MAILPATH,PATH,PSI,PS2(用於一行運行多個命令時),SHELL,TERM(終端),TZ(時區),PWD(目前的目錄),MANPATH(協助文檔存放目錄),TERMINFO,EDITOR等。
5) 特殊變數
$#: 傳遞到指令碼的參數個數
$*: 以一個單字串顯示所有向指令碼傳遞的參數,與位置變數不同,此選項參數可以超過9個。
$$: 指令碼啟動並執行當前進程ID號。
$!: 後台啟動並執行最後一個進程的進程ID號。
[email protected]: 與$#相同,但是使用時加引號,並在引號中返回每個參數。
$-: 顯示shell使用的當前選項,與set命令功能相同。
$?: 顯示最後命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤。
我們修改上述的parm.sh指令碼如下:
parm.sh
#!/bin/bash#parmecho "指令碼的名稱:" $0echo "指令碼的第一個參數:" $1echo "指令碼的第二個參數:" $2echo "指令碼的第三個參數:" $3echo "指令碼的第四個參數:" $4echo "指令碼的第五個參數:" $5echo "指令碼的第六個參數:" $6echo "指令碼的第七個參數:" $7echo "指令碼的第八個參數:" $8echo "指令碼的第九個參數:" $9echo "顯示參數個數:" $#echo "顯示指令碼全部參數:" $*echo "顯示當前指令碼的進程ID號:" $$echo "顯示前一命令啟動並執行狀態:" $?
運行一下,結果如下:
[email protected]:~/develop/workspace/shell_workspace$ ./parm.sh A B C D E F G指令碼的名稱: ./parm.sh指令碼的第一個參數: A指令碼的第二個參數: B指令碼的第三個參數: C指令碼的第四個參數: D指令碼的第五個參數: E指令碼的第六個參數: F指令碼的第七個參數: G指令碼的第八個參數:指令碼的第九個參數:顯示參數個數: 7顯示指令碼全部參數: A B C D E F G顯示當前指令碼的進程ID號: 30089顯示前一命令啟動並執行狀態: 0
shell中的變數基本就這5種,下面我們再看一些與變數相關的命令吧。
與變數相關的命令: 變數替換
變數替換即用變數的值替換它的名子。
在變數名前加$,使用echo $變數名 就可以列印出該變數的值。
變數替換有以下幾種方式:
變數替換方式 |
說明 |
$variable-name |
引用實際值到variable-name |
${variable-name} |
同上 |
${variable-name:+value} |
如果設定了variable-name,則顯示其值,否則,為空白 |
${variable-name:?value} |
如果未設定variable-name,則顯示使用者自訂的錯誤資訊。 |
${variable-name:-value} |
如果未設定variable-name,則顯示其值 |
${variable-name:=value} |
如果未設定variable-name,則設定其值並顯示 |
以下例子示範了這幾個變數替換使用方法和效果
[email protected]:~$ var="hello world!"[email protected]:~$ echo $varhello world![email protected]:~$ echo ${var}hello world![email protected]:~$ echo ${var:+"hello shell!"}hello shell![email protected]:~$ echo ${var1:+"hello shell!"}[email protected]:~$ echo ${var:?"define"}hello world![email protected]:~$ echo ${var:-"hello shell!"}hello world![email protected]:~$ echo ${var1:-"hello shell!"}hello shell![email protected]:~$ echo $var1[email protected]:~$ echo ${var:="hello shell!"}hello world![email protected]:~$ echo ${var1:="hello shell!"}hello shell![email protected]:~$ echo $var1hello shell!
既然有變數替換,那麼相應的肯定有變數清除了。 變數清除
可以清除已設定的變數。
用法: unset variable-name
[email protected]:~$ echo $var1hello shell![email protected]:~$ unset var1[email protected]:~$ echo $var1
影響變數的命令
declare
設定或顯示變數
-f: 只顯示函數名
-r: 建立唯讀變數(declare和typeset)
-x: 建立轉出變數
-i: 建立整數變數
使用+替代-,可以顛倒選項的含義
export
用於建立傳給子shell的變數
--: 表明選項結束,所有後續參數都是實參。
-f: 表明在"名-值"對中名字是函數名
-n: 把全域變數轉換成局部變數。換名話說,命令的變數不再傳遞給shell。
-p: 顯示全域變數列表
readonly
用於顯示或設定唯讀變數
--: 表明選項結束
-f: 建立唯讀變數
set
設定或重設各種shell
shift [n]
用於移動位置變數,調整位置變數。
typeset
用於顯示或設定變數
是declare的同義字
unset
用於取消變數的定義
-- 表明選項結束
-f: 刪除唯讀變數,但不能取消從Shell環境中刪除指定的變數和函數,如PATH,PSI,PS2,PPID,UID,EUDI等。
其實,這些變數大多數已使用過,我們重點看一下shift的用法及意義,如下:
parm.sh
#!/bin/bash#parmecho "指令碼的名稱:" $0echo "指令碼的第一個參數:" $1echo "指令碼的第二個參數:" $2echo "指令碼的第三個參數:" $3echo "指令碼的第四個參數:" $4echo "指令碼的第五個參數:" $5echo "指令碼的第六個參數:" $6echo "指令碼的第七個參數:" $7echo "指令碼的第八個參數:" $8echo "指令碼的第九個參數:" $9echo "顯示參數個數:" $#echo "顯示指令碼全部參數:" $*echo "顯示當前指令碼的進程ID號:" $$echo "顯示前一命令啟動並執行狀態:" $?shiftecho "指令碼的第一個參數:" $1echo "指令碼的第二個參數:" $2
運行結果:
[email protected]:~/develop/workspace/shell_workspace$ ./parm.sh A B C D E F G指令碼的名稱: ./parm.sh指令碼的第一個參數: A指令碼的第二個參數: B指令碼的第三個參數: C指令碼的第四個參數: D指令碼的第五個參數: E指令碼的第六個參數: F指令碼的第七個參數: G指令碼的第八個參數:指令碼的第九個參數:顯示參數個數: 7顯示指令碼全部參數: A B C D E F G顯示當前指令碼的進程ID號: 31218顯示前一命令啟動並執行狀態: 0指令碼的第一個參數: B指令碼的第二個參數: C
接著,我們再改動一下,在shift 後加上2,如下:
parm.sh
#!/bin/bash#parmecho "指令碼的名稱:" $0echo "指令碼的第一個參數:" $1echo "指令碼的第二個參數:" $2echo "指令碼的第三個參數:" $3echo "指令碼的第四個參數:" $4echo "指令碼的第五個參數:" $5echo "指令碼的第六個參數:" $6echo "指令碼的第七個參數:" $7echo "指令碼的第八個參數:" $8echo "指令碼的第九個參數:" $9echo "顯示參數個數:" $#echo "顯示指令碼全部參數:" $*echo "顯示當前指令碼的進程ID號:" $$echo "顯示前一命令啟動並執行狀態:" $?shift 2echo "指令碼的第一個參數:" $1echo "指令碼的第二個參數:" $2
運行結果如下:
[email protected]:~/develop/workspace/shell_workspace$ ./parm.sh A B C D E F G指令碼的名稱: ./parm.sh指令碼的第一個參數: A指令碼的第二個參數: B指令碼的第三個參數: C指令碼的第四個參數: D指令碼的第五個參數: E指令碼的第六個參數: F指令碼的第七個參數: G指令碼的第八個參數:指令碼的第九個參數:顯示參數個數: 7顯示指令碼全部參數: A B C D E F G顯示當前指令碼的進程ID號: 31366顯示前一命令啟動並執行狀態: 0指令碼的第一個參數: C指令碼的第二個參數: D
linux學習之shell指令碼 ------- 變數