shell變量

關於變量的內容

一、變量命名:
二、變量賦值:

三、變量類型:
四、變量取消:
五、取得變量值:

六、調整變量的屬性

七、數組
八、變量擴展:
九、命令擴展:

一、變量名稱:
    1、只能包含字母、數字和下劃線,並且不能以數字開頭,
    2、不應該跟系統中已有的環境變量重名
    3、最好能見名知意

二、變量賦值:

設置變量:
變量名稱=值

var_name=value 等號兩邊不能有空格

1

2

3

[root@lovelace 51cto]# youname=lovelace
[root@lovelace 51cto]# echo $youname
lovelace


針對數字,你可以可以這樣爲變量賦值,定義一個變量的類型

1

2

3

[root@lovelace 51cto]# declare -i sum=100
[root@lovelace 51cto]# echo $sum
100


 

三、bash:變量類型:
    環境變量:
    本地變量(局部變量):
    位置變量:
    特殊變量(系統變量):

本地變量:作用域爲整個bash進程
    varname=value
局部變量:作用域只對當前代碼段有效
    local varname=value

環境變量:作用域爲當前shell進程及其子進程
    export varname=value "導出“

任意腳本在執行時會啓動一個子shell進程,
        命令行中啓動的腳本會繼承當前shell的環境變量
        系統自動執行的腳本(跟命令行無關)就需要自我定義需要的各環境變量

位置變量:
    $1,$2,....

特殊變量:保持某些特殊數據
        $? 上一個命令執行狀態返回值
        $# 參數的個數
        $* 參數列表
        $@ 參數列表
        $0  命令本身  腳本本身
    執行腳本時的腳本路徑及名稱

程序執行一般有兩類返回值  
    程序執行結果;
    執行狀態返回代碼(0-255)
            0表示正確
            1-255:錯誤執行 1,2,127 系統預留 有特殊意義

四、撤銷變量:
    unset varname

1

[root@lovelace 51cto]# unset youname;echo $youname


查看當前shell中的變量
        set  不帶任何參數和選項

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

[root@lovelace 51cto]# set
BASH=/bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i386-redhat-linux-gnu")
BASH_VERSION='3.2.25(1)-release'
COLORS=/etc/DIR_COLORS.xterm
COLUMNS=80
CVS_RSH=ssh
DIRSTACK=()
EUID=0
GROUPS=()
G_BROKEN_FILENAMES=1
HISTFILE=/root/.bash_history
HISTFILESIZE=5000
HISTSIZE=5000
HOME=/root
HOSTNAME=lovelace.localdomain
HOSTTYPE=i386
IFS=$' \t\n'
INPUTRC=/etc/inputrc
LANG=zh_CN.GB2312
LC_ALL=zh_CN.GB2312
LESSOPEN='|/usr/bin/lesspipe.sh %s'
LINES=20
LOGNAME=root
LS_COLORS='no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=00;32:*.bat=00;32:*.sh=00;32:*.csh=00;32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.bz=00;31:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00;35:*.xpm=00;35:*.png=00;35:*.tif=00;35:'
MACHTYPE=i386-redhat-linux-gnu
MAIL=/var/spool/mail/root
MAILCHECK=60
OLDPWD=/home/scripts
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PIPESTATUS=([0]="0")
PPID=16933
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
PWD=/home/scripts/51cto
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SSH_CLIENT='192.168.2.28 8577 22'
SSH_CONNECTION='192.168.2.28 8577 192.168.2.54 22'
SSH_TTY=/dev/pts/0
SUPPORTED=zh_CN.UTF-8:zh_CN.GBK:zh_CN.GB2312:zh_CN:zh:en_US.UTF-8:en_US:en
TERM=xterm
UID=0
USER=root
_=echo
consoletype=pty
sum=100
tmpid=0
x=101


如果查看當前shell中的環境變量
        env
        export
        printenv

字符串變量添加新的變量
 PATH添加新的路徑
export PATH=$PATH:/usr/local/apsch/bin

 

五、取得變量值:
    $變量名稱
    ${變量名稱}  $(x) 這個可以用來當做命令調用
     如果變量在語句當中被引用,必須要使用${x}纔可以,取得數組的變量值時候也需要使用${}來調用

1

2

3

4

5

[root@lovelace 51cto]# listnum=100
[root@lovelace 51cto]# echo $listnum
100
[root@lovelace 51cto]# echo ${listnum}
100


關於變量和引號的關係:
    單引號:所見即所得
    雙引號:使特殊符號生效

1

2

3

4

[root@lovelace 51cto]# echo "There are $listnum pelple."
There are 100 pelple.
[root@lovelace 51cto]# echo 'There are $listnum pelple.'
There are $listnum pelple.




六、調整變量的屬性:

1、readonly 命令 :定義只讀變量
        -p:顯示目前具有隻讀屬性的變量列表
        -f:設定函數不可修改
        -a:定義數組不可修改
2、declare 命令 
        -r:設定只讀變量
        -p:顯示變量的屬性
        -a:變量是一個數組
        -f:搜尋命令時,只找函數
        -i:變量是一個整數
        -F:顯示所有的函數式名稱及其屬性
        -t:設立變量具有trace屬性
        -x:設定環境變量

七、 數組:   

 是一種數據結構,有相關的數據項組成,每個數據項,稱爲數組的元素,且可採用索引的方式取得個元素的值
數組賦值:

1、單個賦值,以index作爲索引號,索引號從0開始
    a[0]=1
    a[2]=2
    a[3]=3

1

2

3

4

5

6

7

8

9

10

11

12

13

14

#爲數組賦值
[root@lovelace 51cto]# a[0]=1
[root@lovelace 51cto]# a[1]=2
[root@lovelace 51cto]# a[2]=3
#顯示數組中所有值方法一
[root@lovelace 51cto]# echo ${a[*]}
1 2 3
#顯示數組中所有值方法二
[root@lovelace 51cto]# echo ${a[@]}
1 2 3
#爲數組添加數據項
[root@lovelace 51cto]# a[3]='nick'
[root@lovelace 51cto]# echo ${a[*]}
1 2 3 nick


2、使用小括號爲數組賦值

    a=(1 2 3) 默認空格隔開

1

2

3

4

5

6

7

8

9

#爲數組b賦值  記住是小括號,不是大括號
[root@lovelace 51cto]# b=(bbs www http ftp)
[root@lovelace 51cto]# echo ${b[*]}
bbs www http ftp
#打印出第一個和第三個數據項
[root@lovelace 51cto]# echo ${b[0]};echo '*******';echo ${b[2]}
bbs
*******
http


3、爲數組中的某一個數據項賦值,默認是從0開始,如果中間出現未比標示的索引項,則從前一個索引項開始計算

    a={51 [3]=5  cto  [6]=8}

1

2

3

4

5

6

7

8

9

10

11

12

#爲數組賦值
[root@lovelace 51cto]# c=(51cto [3]='nick' 51 [5]='lovelace')
#打印出數組中所有值
[root@lovelace 51cto]# echo ${c[@]}
51cto nick 51 lovelace
#驗證中間出現的數值是從哪個索引項開始算起的
[root@lovelace 51cto]# echo ${c[1]}
[root@lovelace 51cto]# echo ${c[0]}
51cto
[root@lovelace 51cto]# echo ${c[2]}
[root@lovelace 51cto]# echo ${c[4]}
51


 

顯示賦值:
    echo ${a[1]}
取出數組中所有的值:
    echo ${a[@]}  或者echo ${a[*]}
取得數組元素的個數:
    echo ${#a[@]} 或者 echo ${#a[*]}

1

2

3

4

5

#打印出數組所有值,統計數組中數據項個數
[root@lovelace 51cto]# echo ${c[@]};echo ${#c[@]};echo ${#c[*]}
51cto nick 51 lovelace
4
4




八、高級變量:
${變量名稱}  變量擴展
$(命令)      命令替換
$((算術式))  算術擴展

 

$(命令) 命令替換:
 測試變量存在與否:
    ${myname:-'nick'} 判斷條件,如果myname存在,就返回值,如果myname不存在,就把-後接的字符串當做整個變量擴展的結果,並傳回

測試變量不存在或爲空,傳回一個默認值
    ${myname:-'nick'} 如果待測變量不存在或爲空,傳回-後的值,存在則傳回變量的值

測試變量不存在或爲空,給變量設定一個默認值
    ${count:=100} 若變量coutn沒有值或爲空,則把待測變量設定爲默認值,

測試變量不存在或爲空,傳回錯誤信息
    ${myname:?"your input error"}

測試變量的存在性:
    ${myname:+Ture} 若變量存在且值非空,則符合判斷

    :  空              測空置
    -   負向            測不存在
    +   正向            測存在
    ?  有問題            檢查是否完備後再來執行吧
    =   設值            給控值變量設定一個默認值

$(命令) 命令替換  此命令等同於·· (esc下的按鍵,不是單引號)這個在編寫腳本的時候很有用

1

2

3

4

5

#打印出當前路徑
[root@lovelace 51cto]# echo $(pwd)
/home/scripts/51cto
[root@lovelace 51cto]# echo `pwd`
/home/scripts/51cto


$((算術式))算術擴展:這個我們在下章將會單獨講解,這裏給出示例查看

1

2

3

[root@lovelace 51cto]# a=3;b=5
[root@lovelace 51cto]# echo $((a+b))
8



九、變量擴展“去字符串切片,字符串長度
 字符串切片是從0開始的 在使用${}的時候 大括號內的變量引用前面的$可以不寫
        ${變量:位置起點}   ${myname:3}
        ${變量:位置起點:長度}

1

2

3

4

5

6

7

8

#定義變量
[root@lovelace 51cto]# myname=lovelace
#取得變量字符串從第三個字符開始到字符串結尾的所有字符
[root@lovelace 51cto]# echo ${myname:3}
elace
#取得變量字符串中從第四個字符開始,長度爲2的字符
[root@lovelace 51cto]# echo ${myname:4:2}
la


    

取部分參數:
        命令行參數是從$1開始的依次類推,$@代表所有參數,命令本身使用$0來表示
        ${@:起點}:由點開始,取得後面的所有的位置參數
        ${@:起點:個數}:由起點開始,取得指定個數的位置參數
示例腳本

1

2

3

4

5

6

7

8

9

10

#!/bin/bash
#Verson:0.1
#Auther:lovelace
#Pragram:test argument
#取得程序名
echo $0
#取得變量的所有值
echo ${@:1}
#取得變量的個數
echo $#


 

執行結果:

1

2

3

4

[root@lovelace 51cto]# ./argument.sh 12 32 45
./argument.sh
12 32 45
3


 

計算字符串長度:
    ${#變量名稱}:傳回變量值的字符串長度
    expr:也可以統計字符串的長度
        1、str="here you are."
           len$(expr length "$str")
           echo "str 字符串長度是:$len"
        2、expr "字符串“:‘。*’
            str="here you are."
            len=$(expr "$str":'.*')
            echo "str字符串長度是:$len"

1

2

3

4

5

6

7

8

9

10

11

12

13

[root@lovelace 51cto]# echo $myname
lovelace
#使用${#變量名}取得字符串長度  比較常用
[root@lovelace 51cto]# echo ${#myname}
8
#使用${expr length “$變量名”}取得字符串長度
[root@lovelace 51cto]# len=$(expr length "$myname")
[root@lovelace 51cto]# echo $len
8
#使用${expr “$變量名” : '.*'}取得字符串長度
[root@lovelace 51cto]# len=$(expr "$myname" : '.*')
[root@lovelace 51cto]# echo $len
8


 

變量擴展:對比樣式
    由字符串前面對比,刪除最短的
         ${變量#樣式}
    由字符串前面對比,刪除最長的
         ${變量##樣式}

1

2

3

4

5

6

7

8

9

10

11

#定義一個變量
[root@lovelace 51cto]# path=$(pwd)
#查看變量值
[root@lovelace 51cto]# echo $path
/home/scripts/51cto
#使用對比樣式
[root@lovelace 51cto]# echo ${path#*/}
home/scripts/51cto
#此對比樣式可以取得目錄名
[root@lovelace 51cto]# echo ${path##/*/}
51cto



    由字符串後面對比,刪除最短的
         ${變量%樣式}
    由字符串後面對比,刪除最長的
          ${變量%%樣式}

1

2

3

4

5

#使用此對比樣式可以取得路徑名
[root@lovelace 51cto]# echo ${path%/*}
/home/scripts
#使用此對比樣式沒有任何數據輸出
[root@lovelace 51cto]# echo ${path%%/*}


 

至於對比樣式可以根據自己的思考來獲得,這個沒有固定的格式

 


取代或刪除部分字符串:
    只替換第一個對比符合的字符串
        ${變量/樣式/替換字符串}
    替換所有符合的字符串
        ${變量//樣式/替換字符串}

1

2

3

4

5

6

7

8

9

#定義一個變量
[root@lovelace 51cto]# echo $myname
lovelace
#替換第一次出現的l爲F
[root@lovelace 51cto]# echo ${myname/l/F}
Fovelace
#替換字符串中所有l爲F
[root@lovelace 51cto]# echo ${myname//l/F}
FoveFace


 


刪除對比符合的字符串
    只刪一個
        ${變量/樣式/}
    刪除全部
        ${變量//樣式/}
    #T  行首位置
    %LE  最後面
   

1

2

3

4

5

6

7

8

9

#定義一個變量獲取IP地址相關的信息
[root@lovelace 51cto]# tmp=$(ifconfig eth0 | grep 'inet addr')
#刪除對比樣式成功的字符串 然後賦值給變量r
[root@lovelace 51cto]# r=${tmp/inet addr:/}
#刪除對比樣式成功的字符串 然後賦值給變量ip
[root@lovelace 51cto]# ip=${r/ Bcast*/}
#打印出變量ip 查看是不是我們想要的結果
[root@lovelace 51cto]# echo $ip
192.168.2.54



變量擴展:取變量名稱列表、數組索引列表
取變量名稱列表:
        ${!開頭字符串@}或${!開頭字符串*}

1

2

3

4

5

[root@lovelace 51cto]# myname=lovelace;mytest=51cto
[root@lovelace 51cto]# echo ${!my@}
myname mytest
[root@lovelace 51cto]# echo ${!my*}
myname mytest


取數組索引列表:
        ${!數組變量[@]}或${!數組變量[*]}

1

2

3

4

5

6

#取得數組a的所有值
[root@lovelace 51cto]# echo ${a[@]}
hello 2 3 nick
#取得數組a的索引項
[root@lovelace 51cto]# echo ${!a[@]}
0 1 2 3


 

後記:學習shell編程,變量這一塊很重要,文章中列出的僅僅是變量內容的一部分,還有很多像系統內置變量,以及環境變量,局部變量之間的轉化,我們這裏沒有提及到,所以需要我們多練習、多總結。就算你一下記不住這麼多知識,熟能生巧總是可以的吧......

本文出自 “追馬” 博客,請務必保留此出處http://lovelace.blog.51cto.com/1028430/1211141


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章