linux-shell編程1:變量和數組

Shell

用戶與系統內核之間交流平臺

Shell類型

/bin/sh
/bin/bash(系統默認bash)
/bin/tcsh
/bin/csh
/etc/shells 放置當前系統可用shell

爲什麼需要shell編程

1.減少繁瑣工作的重複進行,減少錯誤
2.提高工作效率
3.事態的批量化進行

Bash特點功能

1.查看命令歷史(1000條)
    history  查看歷史命令
    history -c  清空歷史命令
    /etc/profile
2.別名
    alias h5='head -5'
    unalias  h5
3.管道符重定向
    ps aux | grep '3306'
    echo "passewd" | passwd --stdin username
    ls > list.txt
    ls -l >> list.txt
    mail -s test [email protected] < list.txt

    find / -user yuxiang -type f > all 2> error

4.命令序列的使用技巧
    在linux中,可以使用控制字符(;,&&,||,&)

        &:將程序後臺執行
            firefox &   可以用ctrl+z將進程後臺執行
            jobs  查看後臺任務
            fg n    將後臺任務拿到前臺
        ;:組合多個命令,命令間沒有任何邏輯關係,順序執行
            [root@server ~]# ls /tmp;ls /root;ls /home
        &&:組合多個命令,前一個命令執行成功才能執行後一個
            make && make install
            [root@server ~]# ls -lh initial-setup-ks.cfg && ls .
        ||:組合多個命令,前一個執行失敗,纔會執行後一個
            [root@server ~]# id yuxiang &> /dev/null && echo "hi,yuxiang" || echo "No such user"

5.花括號{}使用技巧
    通過花括號可以生成命令行或者腳本所需的字串
    括號中可以包含連續的序列或使用逗號分割多個項目
    連續的序列需要包括一個起點和一個終點,倆者之間用“..”分割

        [root@server ~]# mkdir /tmp/dir{1,2,3}
        [root@server ~]# mkdir /tmp/{dir4,dir5,dir6}
        [root@server ~]# mkdir /tmp/dir{7..9}
        [root@server ~]# rm -rf /tmp/dir{1..9}
        [root@server ~]# echo user{1,5,9}
        user1 user5 user9
        [root@server ~]# echo {0..10}
        0 1 2 3 4 5 6 7 8 9 10
        [root@server ~]# echo {0..10..2}
        0 2 4 6 8 10
        [root@server ~]# echo {0..10..3}
        0 3 6 9
        [root@server ~]# echo {2..-1}
        2 1 0 -1
        [root@server ~]# 

變量

變量是用來存儲非固定值的載體,它具有一個值,以及零個或多個屬性
創建變量語法格式:
        name=[value]

1.變量如果沒有指定值(value),變量將被賦值爲空字符串      
2.變量定義後調用《$變量名》來調用變量
3.變量的名稱爲字母,數字,下劃線組成
4.但首字母不能爲數字,=號間無空格
5.變量名無硬性的大小寫要求,建議使用大寫或首字母大寫
6.變量的值可修改,屬性可以通過typeset進行修改
    NAME="魚老闆"
    echo $NAME
    typeset -r NAME   #設置變量屬性只讀 -r

7.可以利用declare創建一個空變量,暫時不賦值
    [root@server ~]# declare NUMBER     #預先定義變量NUMBER
    [root@server ~]# typeset -i NUMBER      #設置NUNBER屬性爲整數型
    [root@server ~]# NUMBER=test            #強制賦值給變量
    [root@server ~]# echo $NUMBER           #打印變量結果爲0
    0
    [root@server ~]# NUMBER=200             #賦值整數成功
    [root@server ~]# echo $NUMBER
    200
8.通過read命令設置變量
    read從標準輸入中讀取變量值(類似於python中的input)
    使用-p選項添加相應的提示信息
        [root@server ~]# read SAY
        hello ervery
        [root@server ~]# echo $SAY
        hello ervery
        [root@server ~]# read -p "plese tail me do you have girl friand:" SAY
        plese tail me do you have girl friand:sorry,I do   
        [root@server ~]# echo $SAY
        sorry,I do
        [root@server ~]#

9.set 查看當前系統中設置的所有變量及值:set |grep ...
  unset  #刪除變量
    unset 變量名
    [root@server ~]# set | grep SAY
    SAY='sorry,I do'
    [root@server ~]# unset SAY
    [root@server ~]# set | grep SAY
    _=SAY
    [root@server ~]# 

變量的作用範圍

使用name=[value]創建變量,默認在當前shell中有效,子進程不會繼承這樣的變量
使用export命令將變量放置到環境變量中,此時可全局使用
export可以直接定義環境變量並賦值
也可以先定義一個普通的用戶變量,然後通export轉換爲環境變量

環境變量

 Bash爲我們預設了很多環境變量,實際操作中我們可以直接調用這些變量(Bash手冊)
    SHELL   查看當前系統的默認Bash
    HOSTNAME    查看系統的主機名
    BASHPID     查看當前Bash進程的進程號
    UID     查看當前用戶的ID號
    HOME    查看當前用戶的家目錄
    PWD     查看當前工作目錄
    PS1     主命令提示符
    PS2     次命令提示符
    RANDOM  0-32767之間的隨機數
    PATH    命令搜索路徑

    #path
    添加PATH路徑:
        PATH=$PATH:/root    #追加
    注意:絕對不能用下列方法
        PATH=/root      #此操作代表覆蓋

位置變量(主要體現在腳本中)

位置變量使得腳本中命令可以調用腳本時不同位置的參數,參數之間一般用空格隔開

$0  代表當前shell程序的文件名稱
$1  代表shell程序的第一個參數
$2  代表shell程序的第二個參數
    以此類推($1-$9)
$#  代表shell程序所有參數的個數
$*和$@   都代表所有參數的內容,區別是$*將所有參數作爲一個整體,而$@將所有參數作爲個體看待
$$  代表當前進程的ID號
%?  代表程序的退出代碼(0代表執行成功,非0代表執行失敗)

        [root@server ~]# cat weizhi.sh 
        #!/bin/bash
        #This is test script for parme!
        echo "This is the file name:$0"
        echo "This is the first parm:$1"
        echo "This sis the second parm:$2"
        echo "This is the number of all  parm:$#"
        echo "This is the all parm:$*"
        echo "This is the all parm:$@"
        echo "This is PID:$$"
        echo "This is parm over:$?"
        [root@server ~]# 

        [root@server ~]# bash weizhi.sh a_1 b_2 c_3 d_4
        This is the file name:weizhi.sh
        This is the first parm:a_1
        This sis the second parm:b_2
        This is the number of all  parm:4
        This is the all parm:a_1 b_2 c_3 d_4
        This is the all parm:a_1 b_2 c_3 d_4
        This is PID:5224
        This is parm over:0
        [root@server ~]# 

變量的展開與替換

#一下四組用於需要確定變量是否正確設置環境
    ${varname:-work}    #當varname存在且不爲空,則返回varname值,否則返回word
    ${varname:=word}    #當varname存在且不爲空,返回varname值,否則返回word ##同時對var進行賦值操作
    ${varname:?message} #當varname存在且不爲空,返回varname值,否則顯示varname:message
    ${varname:+word}    #當varname存在且不爲空,返回word,否則返回null
        [root@localhost ~]# NAME=BJTLXY
        [root@localhost ~]# echo $NAME
        BJTLXY
        [root@localhost ~]# echo ${NAME:-no user};echo ${NAME}
        BJTLXY
        BJTLXY
        [root@localhost ~]# echo ${NAME:=dana};echo ${NAME}
        BJTLXY
        BJTLXY
        [root@localhost ~]# echo ${NAMEs:=dana};echo ${NAME}
        dana
        BJTLXY
        [root@localhost ~]# echo ${NAME:?shuo sha lie};echo $NAME
        BJTLXY
        BJTLXY
        [root@localhost ~]# echo ${NAMEs:?shuo sha lie};echo $NAME
        dana
        BJTLXY
        [root@localhost ~]# echo ${NAMES:?shuo sha lie};echo $NAME
        -bash: NAMES: shuo sha lie
        [root@localhost ~]# echo ${NAMEses:+huanglaoban};echo $NAME

        BJTLXY
        [root@localhost ~]# echo ${NAME:+huanglaoban};echo $NAME
        huanglaoban
        BJTLXY
        [root@localhost ~]# 
#下面六組主要用於需要對變量的值做修改後輸出的場景
    ${varname#key}      #從頭開始刪除關鍵字(key),執行最短匹配
    ${varname##key}     #從頭開始刪除關鍵字,執行最長匹配
    ${varname%key}      #從尾部開始刪除關鍵字,執行最短匹配
    ${varname% %key}        #從尾部開始刪除關鍵字,執行最長匹配
    ${varname/old/new}  #將old替換爲new,替換第一個出現的old
    ${varname//old/new} #將old替換爲new,替換所有

        [root@localhost ~]# USR=$(head -1 /etc/passwd)
        [root@localhost ~]# echo $USR
        root:x:0:0:root:/root:/bin/bash
        [root@localhost ~]# echo ${USR#*:}
        x:0:0:root:/root:/bin/bash
        [root@localhost ~]# echo $USR
        root:x:0:0:root:/root:/bin/bash
        [root@localhost ~]# echo ${USR##*:}
        /bin/bash
        [root@localhost ~]# echo ${USR%:*}
        root:x:0:0:root:/root
        [root@localhost ~]# echo ${USR%%:*}
        root
        [root@localhost ~]# echo ${USR/root/admin}
        admin:x:0:0:root:/root:/bin/bash
        [root@localhost ~]# echo ${USR//root//admin}
        /admin:x:0:0:/admin://admin:/bin/bash
        [root@localhost ~]# 

數組

一組具有相同數據類型的集合
數據類型:
    數值類型:
    字符串類型:
bash提供一維數組的變量功能,數組中所有便利那個都會被編錄成索引,數組的索引從0開始

創建數組:
1.name[subscript]=value
2.name=(value1………………valuen) #用空格隔開
3.declare -a <name> 定義一個空數組

獲取數組的值
可以使用echo ${name[subscript]} 通過索引得到數組的值
如果subscript是@或者*,則將調用所有的數組成員
如果使用${#name[subscript]}可以返回${name[subscript]}長度
如果是*或@,則返回數組中元素個數

    [root@localhost ~]# A[1]=11
    [root@localhost ~]# A[2]=22
    [root@localhost ~]# A[3]=33
    [root@localhost ~]# echo ${A[0]}

    [root@localhost ~]# echo ${A[1]}
    11
    [root@localhost ~]# echo ${A[-1]}
    33
    [root@localhost ~]# A[-1]=99
    -bash: A[-1]: bad array subscript
    [root@localhost ~]# A[6]=66
    [root@localhost ~]# echo ${A[*]}
    11 22 33 66
    [root@localhost ~]# echo ${A[@]}
    11 22 33 66
    [root@localhost ~]# echo ${#name[*]}
    0
    [root@localhost ~]# echo ${#name[@]}
    0
    [root@localhost ~]# echo ${#A[@]}
    4
    [root@localhost ~]# echo ${#A[1]}
    2
    [root@localhost ~]# echo ${A[0]},${A[1]},${A[2]},${A[3]}
    ,11,22,33
    [root@localhost ~]# A[0]=00
    [root@localhost ~]# echo ${A[0]},${A[1]},${A[2]},${A[3]}
    00,11,22,33
    [root@localhost ~]# 

    [root@localhost ~]# B=(aa bb cc)
    [root@localhost ~]# echo ${B[0]},${B[1]},${B[2]}
    aa,bb,cc
    [root@localhost ~]# echo ${B[0]}:${B[1]}:${B[2]}
    aa:bb:cc
    [root@localhost ~]# echo 'length if B_0 is ${#B[0]}'    #請注意此處的錯誤
    length if B_0 is ${#B[0]}
    [root@localhost ~]# echo 'length of B_0 is' ${#B[0]}
    length of B_0 is 2
    [root@localhost ~]# echo 'length of B_1 is' ${#B[1]}
    length of B_1 is 2
    [root@localhost ~]# echo ${#B[*]}
    3
    [root@localhost ~]# 

    數值型數組:(一對括號表示,元素之間空格隔開)
        arr_num=(1 2 3 4 5 6)
    字符型數組:
        arr_string=('aa' 'bb' 'cc' 'dd' )

數組常用操作:

    獲取數組的長度:
        arr_length=${#arr_num[*]}
        arr_length=${#arr_string[@]}
    列出索引下標:
        echo ${!arr_num[@]}
    讀取某個下標的值:
        arr_index_2=${arr_num[2]}
    對某個下標進行賦值
        下標存在:相當與修改原有的值
            arr_num[2]=100
        下標不存在,按照升序走
            arr_num[23]=100
    刪除操作:
        清除某個元素
            unset arr_num[1]
        清除整個數組:
            unset arr_num
    數組的切片:
        格式:${數組名[@/*]:開始下標:取數數值}
        echo ${arr_string[*]:2:3}
    數組的遍歷:
        for v in ${arr_string[@]};do
            echo $v;
        done
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章