Bashe Shell之數組及bash配置文件解析

數組

  數據結構,數據序列,保存了連續的多個數據,可以使用索引獲取相關元素,相當于多個變量的集合

 

§數組名和索引

索引:編號從0開始,屬于數值索引

  注意:所以可支持使用自定義的格式,而不僅是數值格式,即關聯索引,bash4.0版本之后開始支持,bash的數組支持稀疏格式(索引不連續)

 

§聲明數組

    declare –a arryname

    declare –A arryname 關聯數組

 

初始化或賦值:各元素之間使用空白字符隔開,不加下標默認為第一個

第一種方式

    arryname=(‘a’  ‘b’  ‘c’)

    arryname=( [0]=’a’ [1]=’b’ [2]=’c’)

第二種方式

    arryname[1]=”one”

第三種方式:交互式

    read  -a  arryname

    a  b  c

 

§ 引用數組

    echo ${arryname[0]}

 

§獲取元素的長度

    echo  ${#arryname[@]}

    echo  ${#arryname[*]}

    當我們想去某個字符的長度,撓破腦袋想找個工具來計算出字符串的長度時,bash shell提供了計算出字符的長度,這時候bash shell的功能就展露無遺了

    1.jpg

    bash的偽隨機生成器

    $RANDOM

 取特定位數的

   $[$RANDOM%11]:取10以內的隨機數

 

§數組數據處理

  引用數組中的元素:

  所有元素:echo ${arryname[@] , echo ${arryname[*]}

  數組切片:${arryname[@]:offset:number}

     offset:要跳過的元素個數

     number:要去除的元素個數

     echo ${arryname[@]:2:3} 跳過兩個字符,取三個字符

     2.jpg

 向數組中追加元素

    arryname[${#arryname[@]}]

 

  刪除數組中的某元素:導致稀疏格式

    unset arryname[索引編號]

     3.jpg

 關聯數組:

    dexclare –A arryname3

    arryname=([a]=1  [b]=2  [c]=3 … ),這里的索引編號可以自定義

  注意:在賦值之前,必須要聲明數組為關聯數組

    4.jpg

 

 

 

§字符串處理

    bash的字符串處理工具

 字符串切片

    echo ${#arryname}:返回字符串變量的arryname的長度

    echo ${arryname:offset}:返回字符串變量arryname從第offset個字符后(不包括offset的取值在0${#arryname}-1之間

    echo ${arryname:offset:number}:返回字符串變量arryname中從offset個字符后(不包括)的字符開始,長度為number的字符

    echo ${arryname:  -number}:去字符串最右側的幾個字符

 注意:冒號后必須有一個空白字符

     5.jpg

 基于模式取子串

    echo ${arryname#*keyword}:其中keywod可以是指定的任意字符

功能:自左而右,查找arryname變量所存儲的字符串中,第一次出現keyword,刪除字符串開頭至第一次出現keyword字符之間的所有字符

     echo ${arryname##*keyword}

功能:自左而右,查找arryname變量所存儲的字符串中,刪除字符串開頭至最后一次出現keyword字符之間的所有字符

    echo ${arryname%keyword*}:其中keyword可以使指定的任意字符

功能:自由而左,查找arryname變量所存儲的字符串中,第一次出現keyword,刪除字符串最后一個字符至第一次出現keyword字符之間的所有字符

     echo ${arryname%%keyword*}

功能:自由而左,查找arryname變量所存儲的字符串中,刪除字符串最后一個字符至最后一次出現keyword字符之間的所有字符

    6.jpg 

    在工作中,有時可能會遇到去一個url的協議以及端口這時候取字符串這個功能就非常好使了

    url=http://www.magedu.com:80
    ${url##*:}80
    ${url%%:*}http

 

 查找替換

    echo ${arryname/pattern/abc:查找arryname所表示的字符串中,第一次被pattern所匹配到的字符串,用abc來替換

    echo ${arryname//pattern/abc} :查找arryname所表示的字符串中,所有被pattern所匹配到的字符串,用abc來替換

    echo ${arryname/#pattern/abc}:查找arryname所表示的字符串中,行首被pattern所匹配到的字符串,用abc來替換

    echo ${arryname/%pattern/abc}:查找arryname所表示的字符串中,行尾被pattern所匹配到的字符串,用abc來替換

     7.jpg

 

 查找并刪除

    echo ${arryname/pattern}:查找arryname所有字符串中,刪除第一次被pattern所匹配到的字符串

    echo ${arryname//pattern}:查找arryname所有字符串中,刪除所有被pattern所匹配到的字符串

    echo ${arryname/#pattern/abc}:查找arryname所表示的字符串中,刪除行首被pattern所匹配到的字符串echo                       

    ${arryname/%pattern/abc}:查找arryname所表示的字符串中,刪除行尾被pattern所匹配到的字符串

  8.jpg




 字符大小寫轉換

    echo ${arryname^^}:把arryname的所有小寫字母轉換成大寫

    echo ${arryname,,}:把arryname的所有大寫字母轉換成小寫

  9.jpg

 

 

 變量賦值

    echo ${arryname:-value}:如果arryname為空或者未設置,那么就返回value,否則,則返回arryname的值

    echo ${arryname:+value}:如果arryname非空,那么就返回value,否則返回空值

    echo ${arryname:=value}:如果arryname為空或者未設置,那么就返回value,并且將value賦值給arryname,否則返回arryname的值

    echo ${arryname:?error_messages}:如果arryname的值為空或未被設置,那么返回error_messages;否則,則返回arryname的值

  10.jpg

 

 為腳本程序使用配置文件,實現變量賦值

1.         定義在文本文件中,每行定義”name=value”

2.         在腳本中source次文件即可

 

   Shell變量一般是無類型的,但是Bash Shell提供了declaretypeset兩個命令用于指定變量的類型,兩個命令是完全等價的

declare [選項] 變量名

         -r 將變量設置為只讀屬性

         -I 將變量設置為整型

         -a 將變量設置為數組

         -A 將變量設置為關聯數組

         -f 顯示此腳本前定義過的所有函數名及內容

         -F 僅顯示此腳本前定義過的所有函數名

         -x 將變量定義為環境變量

         -l 將變量值轉為小寫字母

         -u 將變量值轉為大寫字母

 

 間接變量引用

 如果第一個變量的值是第二個變量的名字,從第一個變量引用第二個變量的值就成為間接引用

    a=b

    b=123

    a的值b,而b又是變量名

    b的值為123,間接變量引用是指通過a獲得變量值123的行為

    Bash Shell提供了兩種格式實現間接變量引用

    eval c=\\$$a

    c=${!a}

    11.jpg

 

    Bash如何展開命令行

 把命令行分成單個命令詞

 展開別名

 展開大括號中的聲明

 展開波浪符聲明(~

 命令替換$()和` `

 再次把命令行分成命令詞

 展開文件通配符(*、?、[ab]

 準備I/O重定向(<、>

 運行命令

 

 

 防止擴展

 反斜線(\)會使隨后的字符按原意解釋

 echo you cost :\$500

 加引號來防止擴展

 單引號’ ‘ 防止所有擴展

 雙引號也防止所有擴展,但是一下幾種情況除外

   $     變量擴展

   `          命令替換

   \          禁止單個字符擴展

   !          歷史命令替換

 

    Bash的配置文件

 按生效范圍劃分

 全局配置

    /etc/profile

    /etc/profile.d/*.sh

    /etc/bashrc

 個人配置

    ~/.bash_profile

    ~/.bashrc

  按功能劃分

    profile類:為交互式登錄的shell提供配置

 全局:/etc/profile,/etc/profile.d/*.sh

 個人:~/.bash_profile

 功能

1.         用于定義環境變量

2.         運行命令或腳本

 

    bashrc類:為非交互式登錄的shell提供配置

 全局:/etc/bashrc

 個人:~/.bashrc

 功能

 定義命令別名

 定義本地變量

 

 修改profilebashrc文件后需生效

 兩種方法:

 重新啟動shell進程

   “.” source  文件

 

   shell登錄的兩種方式

  交互式登錄:

    (1)直接通過終端輸入賬號密碼登錄;

    (2)使用“su-UserName”切換的用戶

 執行順序:

    /etc/profile-à/etc/profile.d/*.shà~/.bash_profileà~/.bashrcà/etc/bashrc

 

 非交互式登錄:

   (1)suUserName

   (2)圖形界面下打開的終端

   (3)執行腳本

 執行順序:

    ~/.bashrcà/etc/bashrcà/etc/profile.d/*.sh

 

    Bash退出任務

 保存在~/.bash_logout文件中

 在退出登錄shell時運行

 用于創建自動備份和清除臨時文件

 

 

 

1、生成10個隨機數,采用冒泡算法進行升序或降序排序

  將給出的數,一次做大小比較,從小往大的順序排列

 #!/bin/sh
 #sorting following array
 echo "please input a number list:"
 read -a arr
   for (( i=0 ; i<${#arr[@]} ; i++ ))
   do
    for (( j=${#arr[@]} – 1 ; j>i ; j– ))
    do
     #echo $j
      if  [[ ${arr[j]} -lt ${arr[j-1]} ]]
      then
       t=${arr[j]}
       arr[j]=${arr[j-1]}
       arr[j-1]=$t
      fi
   done
 done
 echo "after sorting:"
 echo ${arr[@]}
 12.jpg

 

原創文章,作者:fszxxxks,如若轉載,請注明出處:http://www.www58058.com/39355

(0)
fszxxxksfszxxxks
上一篇 2016-08-24
下一篇 2016-08-24

相關推薦

  • 你收到來自一個來自noob的blog,請注意查收~

                  本人較為懶,部分內容為直接cp,勿怪                 圖片借鑒余知乎某位深藏不漏的用戶 關于ls命令輸出結果的詳解:     1 如何知道自己當前…

    2017-09-03
  • 17 正則表達式及作業

    17 正則表達式及作業     因為正則表達式類型較多且比較重要,因此單獨拿出一篇進行陳述。 正則表達式是各種文本處理工具的基礎,也是shell編程必須牢牢掌握的知識,其重要性不言而喻。 一、雜項知識整理 1、一個[:space:]包括一個tab。 2、區分好文件名通配(globing)和文件內容通配(正則表達式)。 …

    Linux干貨 2016-08-05
  • Ubuntu之apt-get光盤源配置小結

    Ubuntu配置本地apt源的方法:    1. 命令自動配置:        mount    /dev/cdrom   /mnt/cdrom        apt-cdrom   ident   &nbsp…

    Linux干貨 2016-03-09
  • DNS and BIND

    DNS and BIND 名稱解析:把一種代號轉換成為另一種代號的功能是應用程序基于某個搜索鍵在指定的數據庫查詢,查詢到對應的鍵以后,對應鍵被找出來的過程!passwd —《nsswith》/etc/nsswith.conf 注意:查詢的時候用到的是UDP的53,主從復制走的是tcp(但是也用到udp) DNS: Domain Name Serv…

    Linux干貨 2016-10-21
  • 常用RAID級別介紹

    RAID是什么         磁盤陣列(Redundant Arrays of Independent Disks,RAID),磁盤陣列是將多個價格便宜的磁盤按照一定的組合方式組成具有高容量的磁盤組,按照不同的組合方式可以達到不同的效果,如:可以提升磁盤的存取效率,可提高磁盤的…

    Linux干貨 2016-02-14
  • python面向對象魔術方法

    python面向對象魔術方法

    Linux干貨 2017-11-20

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-26 10:09

    文章內容很完整,讓我明白了數組的定義和調用,但在bash環境配置,只是進行了知識點的羅列,這是不合適的,希望自己能通過總結成自己的語言,清晰的表述出自己想要表達的意思。

欧美性久久久久