標籤:shell 變數 引用
變數
本地變數:類似於局部變數,只在當前shell進程有效
環境變數:適用於所有登入進程所產生的子進程
位置參數:用於向shell指令碼傳遞參數,唯讀
變數替換和賦值
引用變數值就稱為變數替換,$就為變數替換符號,如a為變數名則$a或${a}為變數值
將值賦給某個變數名就稱為變數賦值,格式:variable=value或${ variable=value },如值中包含空格則必須用""
清除變數的值:
unset 變數名
設定唯讀變數:
variable=value
readonly variable
還可以用declare和typeset實現
查看系統中的所有唯讀變數:
[[email protected] tmp]# readonly
declare -ar BASH_VERSINFO=‘([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")‘
declare -ir EUID="0"
...
變數賦值的模式
1.variable:?value或variable?value
對未賦值的variable顯示系統錯誤
[[email protected] tmp]# echo ${a:?blue}
bash: a: blue
[[email protected] tmp]# a=black
[[email protected] tmp]# echo ${a:?blue}
black
2.variable:=value
對未賦值的variable,將value值賦給它
[[email protected] tmp]# a=black
[[email protected] tmp]# echo ${a:=blue}
black
[[email protected] tmp]# unset a
[[email protected] tmp]# echo ${a:=blue}
blue
[[email protected] tmp]# echo $a
blue
3.variable:-value
對未賦值的variable,返回value,但是variable仍未賦值
[[email protected] tmp]# unset a
[[email protected] tmp]# echo ${a:-blue}
blue
[[email protected] tmp]# echo ${a:?blue}
bash: a: blue
無類型的shell指令碼變數
shell指令碼變數是無類型的,並且同時具有數字型和字元型兩種賦值,可以不用預定義變數而直接使用,數字型的初始值為0,字元型的初始值為空白
[[email protected] tmp]# cat a.sh
#! /bin/sh
c=""
echo "c=$c"
let "c+=1" #let命令用於執行算數運算,let "c+=1"等價於c+=1
echo "c=$c"
echo "e=$e"
let "e+=1"
echo "e=$e"
e="hello" #此時該變數的數字值又變為0
echo "e=$e"
let "e+=2"
echo "e=$e"
[[email protected] tmp]# ./a.sh
c=
c=1
e=
e=1
e=hello
e=2
環境變數
父進程的環境變數可以傳遞給子進程,但是子進程的環境變數(或者修改了父進程定義的環境變數)傳遞不了也影響不了父進程
定義環境變數:
ENVIRON-VARIABLE=value
export ENVIRON-VARIABLE
習慣環境變數用大寫
export表明此變數為環境變數
清除環境變數:
unset ENVIRON-VARIABLE
重要的環境變數:
1.PWD和OLDPWD
PWD記錄目前的目錄,OLDPWD記錄舊的工作目錄
[[email protected] tmp]# echo $PWD
/tmp
[[email protected] tmp]# cd
[[email protected] ~]# echo $PWD
/root
[[email protected] ~]# echo $OLDPWD
/tmp
2.PATH
shell為每個輸入命令搜尋PATH中的目錄列表
[[email protected] ~]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin
[[email protected] ~]# export PATH=$PATH:/tmp/bin #添加新路徑
[[email protected] ~]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:/tmp/bin
3.HOME
使用者家目錄的路徑
[[email protected] ~]# echo $HOME
/root
4.SHELL
儲存預設的shell值(/bin/bash)
5.USER和UID
已登入使用者的名字和已登入使用者的ID
[[email protected] ~]# echo $USER $UID
root 0
6.PPID和$
$PPID當前進程的父進程號,$$為當前進程的進程號
7.PS1和PS2
分別為開頭的提示符和分行的提示符(即命令分多行輸入時的提示符)
[[email protected] ~]# echo $PS1
[\[email protected]\h \W]\$
[[email protected] ~]# echo $PS2
>
\u代表目前使用者名
\h代表主機名稱
\H代表主機名稱和網域名稱
\W代表當前工作目錄的名字
\w代表當前工作目錄的完整路徑
\$ UID為0則顯示#,否則列印$
8.IFS
指定shell的輸入欄位分隔字元,預設為空白格
[[email protected] ~]# export IFS=" "
[[email protected] ~]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:/tmp/bin
[[email protected] ~]# export IFS=:
[[email protected] ~]# echo $PATH
/usr/kerberos/sbin /usr/kerberos/bin /usr/local/sbin /usr/local/bin /sbin /bin /usr/sbin /usr/bin /usr/X11R6/bin /root/bin /tmp/bin
環境變數設定檔
在使用者的根目錄中,為隱藏檔案
1. .bash_profile
使用者登入時自動執行,初始化環境變數,如果不存在該檔案則執行/etc/profile
可以自己加入新的環境變數,並且執行. .bash_profile或者source .bash_profile立即生效(登出也可以)
source命令等價於.命令
直接執行檔案是啟動一個子shell,而子shell指令碼設定的環境變數無法影響當前shell指令碼,soure命令(或.命令)讓簡本在當前shell執行
[[email protected] ~]# cat .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
2. .bashrc
設定子shell的環境變數,使得使用者登入時的環境變數設定與子shell的環境變數設定相分離,提高靈活性
3. .bash_logout
在使用者登出時執行,可以寫入清楚某些環境變數的命令,也可以不存在
export PATH
unset USERNAME
父進程,子進程環境變數關係
子進程能繼承父進程的環境變數,但是子進程修改父進程的環境變數只對子進程有效,不影響父進程環境變數,子進程建立的環境變數父進程也接收不到,而本地變數則互不影響
例:
[[email protected] tmp]# cat father.sh
#! /bin/bash
fatherLocal="fatherLocal"
fatherEnviron="fatherEnviron"
export fatherEnviron
echo "in fahter.sh"
echo "father process ID is $$"
echo "fatherLocal is $fatherLocal"
echo "fatherEnviron is $fatherEnviron"
$PWD/child.sh
echo "return to father.sh"
echo "fatherLocal is $fatherLocal"
echo "fatherEnviron is $fatherEnviron"
[[email protected] tmp]# cat child.sh
#! /bin/bash
echo "in child.sh"
echo "child process ID is $$ and my father is $PPID"
echo "fatherLocal is $fatherLocal"
echo "fatherEnviron is $fatherEnviron"
echo "change faterEnviron"
export "fatherEnviron=redefinfatherEnviron"
echo "new fatherEnviron is $fatherEnviron"
結果:
[[email protected] tmp]# ./father.sh
in fahter.sh
father process ID is 29171
fatherLocal is fatherLocal
fatherEnviron is fatherEnviron
in child.sh
child process ID is 29172 and my father is 29171
fatherLocal is
fatherEnviron is fatherEnviron
change faterEnviron
new fatherEnviron is redefinfatherEnviron
return to father.sh
fatherLocal is fatherLocal
fatherEnviron is fatherEnviron
位置參數
$0 指令碼名稱
$1 第一個參數
${10} 第十個參數,從10開始要加{}
$# 參數個數
$*或[email protected] 所有參數,不包括$0
$$ 進程號
$PPID 父進程號
$? 退出狀態,0表示沒有錯誤,非0表示有錯誤
引用
引用是屏蔽特殊字元的特殊意義,而將其解釋為字面意義
"" 引用除了貨幣符號($),反引號(``),反斜線(\)之外的所有字元
‘‘ 引用除了‘‘本身的所有字元
`` 反引號,shell將反引號中的內容解釋為系統命令
\ 反斜線,屏蔽下一個字元的特殊含義
對於變數加雙引號可以保留多個空格(還有換行),而不解釋為欄位的分隔字元(IFS預設為空白),即雙引號有防止變數變分隔字元的作用
例:
[[email protected] tmp]# a="a b c"
[[email protected] tmp]# echo $a
a b c
[[email protected] tmp]# echo "$a"
a b c
[[email protected] tmp]# echo ‘$a‘
$a
[[email protected] tmp]# echo ‘why can‘t I‘m you are‘
why cant Im you are
[[email protected] tmp]# echo "why can‘t I‘m you are"
why can‘t I‘m you are
命令替換
將命令執行的標準輸出替換該命令所在的位置
反引號(``)和$()
$()命令可以嵌套
$()將\就是\,而反引號(``)將\解釋為空白格
利用反引號可以將其它語言執行的結果賦值給shell變數,從而用shell處理
例:
[[email protected] tmp]# echo \\
\
[[email protected] tmp]# echo $(echo \\)
\
[[email protected] tmp]# echo `echo \\`
#空白行
command `echo` #command代表任何命令,這裡相當於不帶參數
command "`echo`" #帶Null 字元串參數
command `echo x y` #帶兩個參數,為x和y
command "`echo x y`" #帶一個參數,為x y
轉義
作用:
1.解除一些特殊字元的含義
2.單個\在命令列中為出現二級提示符,在shell指令碼中同樣適用
3.在echo、sed、awk等命令中讓一些字母能夠表達特殊含義
1.
variable="()\\{}\$\""
echo $variable
echo "$variable"
IFS=‘\‘ #改變輸入變數分隔字元
echo $variable
echo "$variable" #雙引號有防止變數變分隔字元的作用,保留變數分隔字元
[[email protected] tmp]# ./a3.sh
()\{}$"
()\{}$"
() {}$"
()\{}$"
2.
2.1
[[email protected] tmp]# echo \
> hello world
hello world
2.2
[[email protected] tmp]# echo \ #echo可以用""也可以不用
> "hello world"
hello world
2.3
[[email protected] tmp]# echo "\" #注意這和前面兩個存在本質的區別,這裡的\轉義了"導致缺少後",補全命令才結束,和2.4同
> hello world"
"
hello world
2.4
[[email protected] tmp]# echo "
> hello
> world"
hello
world
2.5
[[email protected] tmp]# variable=\
> hello world
bash: world: command not found #變數賦值如果有空格必須用引號
2.6
[[email protected] tmp]# variable=\
> "hello world"
[[email protected] tmp]# echo $variable
hello world
2.7
[[email protected] tmp]# cat a5.sh
#! /bin/bash
echo \ #單個/在shell指令碼中同樣適用
hello world
[[email protected] tmp]# ./a5.sh
hello world
3.
\後跟字母的特殊含義:
\n 新的一行
\r 返回
\t tab鍵
\v或\f 換行但游標忍停留在原來的位置(橫座標相同)
\b 退格鍵
\a 發出警報聲
\0xx ASCII碼0xx對應的字元
例:
[[email protected] tmp]# echo hello\b\101
hellob101
[[email protected] tmp]# echo $‘hello\b\101‘ #和-e ""基本等價
hellA
[[email protected] tmp]# echo -e "hello\b\0101" #注意\0101的0,沒有0不能解析成ASCII碼
hellA
[[email protected] tmp]# echo -e "hello\b\101"
hell\101
[[email protected] tmp]# echo -e hello\b\101 #注意-e沒有""同樣不能解析
hellob101
注意:
echo [選項] [字串]
選項-e表示將轉移符(\)後跟字元形成的特殊字元解釋成特殊意義
選項-n表示輸出文字後不換行:
[[email protected] tmp]# echo -n "hello"
hello[[email protected] tmp]#
本文出自 “flyclc” 部落格,請務必保留此出處http://flyclc.blog.51cto.com/1385758/1540166