bash shell學習之變量

關於變量的內容linux

1、變量命名:
2、變量賦值:shell

3、變量類型:
4、變量取消:
5、取得變量值:編程

6、調整變量的屬性數組

7、數組
8、變量擴展:
9、命令擴展:
bash

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

2、變量賦值:less

設置變量:
變量名稱=值dom

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

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

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

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

 

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

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

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

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

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

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

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


4、撤銷變量:
    unset varname

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


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

[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

 

5、取得變量值:
    $變量名稱
    ${變量名稱}  $(x) 這個能夠用來當作命令調用
     若是變量在語句當中被引用,必需要使用${x}才能夠,取得數組的變量值時候也須要使用${}來調用

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

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

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



6、調整變量的屬性:

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



7、 數組:   

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

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

#爲數組賦值
[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

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

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

#爲數組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

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

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

#爲數組賦值
[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[*]}

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



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

 

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

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

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

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

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

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

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

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

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

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

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

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

    

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

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

 

執行結果:

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

 

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

[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

 

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

#定義一個變量
[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


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

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

 

至於對比樣式能夠根據本身的思考來得到,這個沒有固定的格式

 


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

#定義一個變量
[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  最後面
   

#定義一個變量獲取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


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

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

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

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

 

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

相關文章
相關標籤/搜索