key words:定義 、命名規(guī)則 、設(shè)置局部變量與全局變量 、讀取變量值、取消與清空變量、變量的有效作用范圍、設(shè)置PATH環(huán)境變量、bash的內(nèi)置命令和內(nèi)置變量、調(diào)整變量的屬性、別名、數(shù)組 一、什么是變量 ...
key words:定義 、命名規(guī)則 、設(shè)置局部變量與全局變量 、讀取變量值、取消與清空變量、變量的有效作用范圍、設(shè)置PATH環(huán)境變量、bash的內(nèi)置命令和內(nèi)置變量、調(diào)整變量的屬性、別名、數(shù)組
一、什么是變量
變量——可以暫時存儲數(shù)據(jù)的地方,程序設(shè)計的基石
bash shell 沒有所謂的數(shù)據(jù)形態(tài),不會區(qū)分整型、浮點型、字符型等變量,在bash shell中默認只有一種數(shù)據(jù)型態(tài):以字符組成的字符串,bash shell把任何存儲在變量中的值皆視為以字符組成的字符串,除非使用內(nèi)置命令declare特別指定變量形態(tài)
所以,bash shell的變量不必經(jīng)過事先聲明,想用就用。
例:
[root@localhost ~]# cat bb
i=liting
echo i am $i
echo done
[root@localhost ~]# chmod a+x bb
[root@localhost ~]# ./bb
i am liting
done
二、變量名稱
由英文字母、數(shù)字和下劃線組成,開頭第一個字母不能使用數(shù)字,有大小寫區(qū)別,長度不限。
例:mydomain、_for_system、BlackCar
三、設(shè)定變量:變量名=值
最好用雙引號或單引號把變量值括起來,單引號的作用是形成一個所見即所得的字符串,不會進行任何替換變量的操作,雙引號可以替換變量、命令執(zhí)行結(jié)果及算術(shù)運算結(jié)果。
設(shè)定局部變量
例:myname="liting wen"
[root@localhost ~]# cat bb
#! /bin/bash
shopt -s -o nounset
h="twenty_four"
i="i am $h"
echo $i
[root@localhost ~]# ./bb
i am twenty_four
在腳本前面加上shopt -s -o nounset可以避免手誤寫錯變量,-s:打開選項,nounset:變量一定要先設(shè)定過才能使用,否則會提示unbound variable
設(shè)定全局變量:
全局變量=環(huán)境變量
若該變量需要在其他子進程中執(zhí)行,則需要用export來使變量變成環(huán)境變量。
[root@localhost ~]# cat testvar.sh
#! /bin/bash
testvar="hello world"
export testvar
echo $testvar
[root@localhost ~]# ./testvar.sh
hello world
[root@localhost ~]# bash 進入一個子shell
[root@localhost ~]# ./testvar.sh
hello world
四、讀取變量值
$變量名稱 ${變量名稱}
若變量后面接有字母或下劃線,必須用 {} 括起變量名
#! /bin/bash
shopt -s -o nounset
h=twenty
echo ${h}_four
[root@localhost ~]# ./bb
twenty_four
[root@localhost ~]# vim bb
[root@localhost ~]# ./bb 否則會出現(xiàn)以下報錯
./bb: line 4: h_four: unbound variable
除了echo,bash還提供了一個和C語言類似的printf命令:
[root@localhost ~]# cat bb
#! /bin/bash
shopt -s -o nounset
h="wlt"
printf "%s""$h "
[root@localhost ~]# ./bb
wlt
s%:字符串
d%:整數(shù)
f%:浮點數(shù)
%%:顯示%這個符號
c%:字符
五、取消與清空變量
取消變量
unset變量名稱/函數(shù)名稱
-v 表示要取消的是變量
-f 表示要取消的是函數(shù)
例:
[root@localhost ~]# cat bb
#! /bin/bash
shopt -s -o nounset
h="twenty_four"
unset -v h
printf "%s""$h "
[root@localhost ~]# ./bb
./bb: line 5: h: unbound variable
清空變量:
變量名稱=
例:
[root@localhost ~]# cat bb
#! /bin/bash
shopt -s -o nounset
h="twenty_four"
h =
printf "%s""$h "
[root@localhost ~]# ./bb
[root@localhost ~]#
六、變量的有效作用范圍
bash shell中 有兩種類型的變量:
全局變量
本地變量
本地變量只在本進程中有效
全局變量在shell會話和該shell產(chǎn)生的任何子進程中可見,本地變量只在創(chuàng)建他們的shell中可見。
查看全局變量:
[root@localhost ~]# printenv
SSH_AGENT_PID=3624
HOSTNAME=localhost.localdomain
DESKTOP_STARTUP_ID=
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
GTK_RC_FILES=/etc/gtk/gtkrc:/root/.gtkrc-1.2-gnome2
WINDOWID=24117329
USER=root
。。。。。。
LESSOPEN=|/usr/bin/lesspipe.sh %s
DISPLAY=:0.0
G_BROKEN_FILENAMES=1
COLORTERM=gnome-terminal
XAUTHORITY=/tmp/.gdmOKVDWV
查看特定進程下的所有環(huán)境變量:
[root@localhost ~]# set
BASH=/bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_LINENO=()
。。。。。。
HISTSIZE=1000
HOME=/root
HOSTNAME=localhost.localdomain
HOSTTYPE=i686
IFS=$' \t '
INPUTRC=/etc/inputrc
LANG=zh_CN.UTF-8
LESSOPEN='|/usr/bin/lesspipe.sh %s'
。。。。。。
XMODIFIERS=@im=none_=clear
consoletype=pty
tmpid=0
使用set命令時并非所以默認的環(huán)境變量都會列出來,應(yīng)為雖然有很多環(huán)境變量,但并非所以環(huán)境變量都有值。
全局變量和本地變量的作用范圍例子:
[root@localhost ~]# echo $HOME
/root
[root@localhost ~]# bash 用bash命令開啟一個新的shell
[root@localhost ~]# bash
[root@localhost ~]# echo $HOME 全局命令依然可用
/root
[root@localhost ~]# exit
exit
[root@localhost ~]# exit 退出兩層shell
exit
[root@localhost ~]# i=5 定義一個本地環(huán)境變量
[root@localhost ~]# echo $i
5
[root@localhost ~]# bash 再開啟一個新shell
[root@localhost ~]# echo $i 顯示不了發(fā)現(xiàn)剛才定義的環(huán)境變量
全局變量
export -p :列出當前所有的環(huán)境變量
例:
[root@localhost ~]# cat testvar.sh
#! /bin/bash
testvar="hello world"
export testvar
echo $testvar
[root@localhost ~]# bash
[root@localhost ~]# ./testvar.sh
hello world
[root@localhost ~]#
設(shè)置PATH環(huán)境變量
Linux系統(tǒng)上發(fā)生的很多命令問題都是由PATH環(huán)境變量造成的,它定義shell在哪里查找命令行中輸入的命令,如果如法找到就會生成錯誤信息:
[root@localhost ~]# liting
bash: liting: command not found
[root@localhost ~]#
當程序把可執(zhí)行程序房子PATH環(huán)境變量以為的目錄中時,可以在現(xiàn)有PATH中添加新的搜索目錄。
[root@localhost ~]# 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
[root@localhost ~]# PATH=$PATH:/root/liting
[root@localhost ~]# 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:/root/liting
[root@localhost liting]# chmod a+x aa
[root@localhost liting]# aa
it work!
[root@localhost liting]# cd
[root@localhost ~]# aa
it work!
[root@localhost ~]# cd /etc
[root@localhost etc]# aa
it work!
[root@localhost etc]#
七、bash的內(nèi)置命令和內(nèi)置變量
bash的內(nèi)置命令
可以不去程序搜尋路徑$PATH中尋找,直接就可以執(zhí)行,速度比較快,常見的內(nèi)置命令有:
alias、bg、bind、break、type、time、logout、export、exec、declare、dirs、echo、enable、help、if、kill、return等
bash默認建立了許多內(nèi)置變量,shellscript程序設(shè)計者不可不知
例如
BAHS、BASH_VERSION、CDPATH、HOME、HOSTTYPE、LANG、PATH、TMOUT、UID ……
八、調(diào)整變量的屬性
想某些變量的值不被修改,例如PI=3.14,可以把變量設(shè)為只讀變量
命令:
readonly
declare
readonly 變量名
[root@localhost ~]# cat bb
#! /bin/bash
shopt -s -o nounset
readonly x=3
x=8
echo $x
[root@localhost ~]# ./bb
./bb: line 4: x: readonly variable
3
[root@localhost ~]#
readonly -p :顯示目前只讀變量
readonly -f 函數(shù)名稱 :該函數(shù)式不可修改
readonly -a 數(shù)組變量 :只讀數(shù)組
declare -r 變量名稱
例
[root@localhost ~]# cat bb
#! /bin/bash
shopt -s -o nounset
x=2
declare -r x
x=8
echo $x
[root@localhost ~]# ./bb
./bb: line 5: x: readonly variable
2
[root@localhost ~]#
declare的其他用法:
declare -p VAR 顯示VAR的屬性
declare -a arry 設(shè)定arry是個數(shù)組
declare -i VAR 設(shè)定VAR是整數(shù)型態(tài)
declare -x VAR 設(shè)定VAR為環(huán)境變量
九、別名
查看系統(tǒng)設(shè)置的別名:
[root@localhost ~]# alias -p
alias cp='cp -i'
alias l.='ls -d .* --color=tty'
alias ll='ls -l --color=tty'
alias ls='ls --color=tty'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
設(shè)置別名
[root@localhost ~]# alias ld='ls -ld'
[root@localhost ~]# ld
drwxr-x--- 19 root root 4096 05-29 08:38 .
[root@localhost ~]# ld /etc
drwxr-xr-x 101 root root 12288 05-29 08:37 /etc
[root@localhost ~]#
取消別名
unalias 別名
unalias -a 取消所有別名
[root@localhost ~]# unalias ld
[root@localhost ~]# ld /etc
/etc: file not recognized: Is a directory
[root@localhost ~]#
設(shè)置別名的文件:~./bashrc
十二、數(shù)組
bash shell只支持一維數(shù)組(關(guān)系型數(shù)組在bash4.0中才支持),其元素個數(shù)沒限制,數(shù)組的索引由0開始,不一定要連續(xù),也可以用算術(shù)表達式表示,如1+3
例:
A[0]=1
A[1]=3
A[2]="bash shell"
1、取出數(shù)組元素
取出數(shù)組A的第三個元素值:echo ${A[2]}
取出數(shù)組所有的元素:echo ${[@]}或echo ${[*]}
取出數(shù)組元素的個數(shù) ${#A[@]}
例:
[root@localhost ~]# cat bb
#! /bin/bash
shopt -s -o nounset
A[0]=1
A[1]=3
A[2]=5
echo ${A[2]}
echo ${A[@]}
echo ${#A[@]}
[root@localhost ~]# ./bb
5
1 3 5
3
2、取消數(shù)組元素:unset A[n] 取消數(shù)組A:unset A
[root@localhost ~]# cat bb
#! /bin/bash
shopt -s -o nounset
A[0]=1
A[1]=3
A[2]=5
unset A[0]
echo ${A[0]}
echo ${A[@]}
echo ${#A[@]}
[root@localhost ~]# ./bb
./bb: line 7: A[0]: unbound variable
本文出自 “吖one的學(xué)習(xí)筆記” 博客,請務(wù)必保留此出處
http://oneliting.blog.51cto.com/1043925/650908