bash編程之數組和字符串處理

數組:

程序=指令+數據
    
    指令:
    數據:變量、文件

數組:存儲過個元素的連續的內存空間;

變量:存儲單個元素的內存空間;

數組名:整個數組只有一個名字;

數組索引:編號從0開始;
    
    數組名[索引],
    ${ARRAY_NAME[INDEX]}

注意:bash-4及之后的版本,支持自定義索引格式,而不僅僅是0,1,2 ...數字格式;此類數組稱之為“關聯數組”

聲明數組:

如果往一個變量里邊指定多個元素,如果沒有聲明為數組,只不過是當成多個元素的的那個字符串,declare -a NAME :聲明索引數組declare -A NAME:聲明關聯數組

數組中元素的賦值方式:

(1)一次只賦值一個元素
    ARRAY_NAME[INDEX]=value

(2)一次賦值全部元素
    ARRAY_NAME=("VAL1""VAL2""VAL3" ...)

(3)只賦值特定元素;
    ARRAY_NAME=([0]="VAL1" [3]="VAL4" ...)

引用數組中的元素: ${ARRAY_NAME[INDEX]} ${ARRAY_NAME[*]}:引用數組中的所有元素

注意:引用時,只給數組名,表示引用下標為0的元素;

數組的長度(數組中元素的個數):

${#ARRAY_NAME[*]}${#ARRAY_NAME[@]}

示例:

生成10個隨機數,并找出其中最大值;

#!/bin/bash#declare -a randdeclare -l max=0for i in {0..9};do
        rand[$i]=$RANDOM
        echo ${rand[$i]}
        [ ${rand[$i]} -gt $max ] && max=${rand[$i]}doneecho "MAX:$max"[root@centous1 ~]# ./123.sh773293356870254241086732703140529551975322949MAX:32703

練習:定義一個數組,數組中的元素是/var/log目錄下所有以.log結尾的文件;統計其下標為偶數的文件中的行數之和;

#!/bin/bash#declare -a files
files=(/var/log/*.log)declare -i lines=0for i in $(seq 0 $[${#files[*]}-1]);do
        if [ $[$i%2] -eq 0 ];then
                let lines+=$(wc -l ${files[$i]} | cut -d' ' -f1)        fidoneecho "Lines:$lines"[root@centous1 ~]# ./lines.shLines:3153

數組元素切片:

${ARRAY_NAME[@]: offset:number} offset:要咯過的元素個數; number:要取出的元素個數;省略number時,表示取偏移量之后的所有元素;

向非稀疏數組中追加元素:

ARRAY_NAME[${#ARRAY_NAME[*]}=

刪除數組中的某元素;

unset ARRAY[INDEX]

關聯數組:

declare -A ARRAY_NAME
    
    ARRAY_NAME=([index_name1]="value" ...)

bash的內置字符串處理工具:

字符串切片:

取字符串的字串;
去字符串的最右側的幾個字符:${var: -number}
注意:冒號后邊必須有一個空白字符;
[root@centous1 ~]# name=jarry[root@centous1 ~]# echo ${name:2:2}rr
[root@centous1 ~]# echo ${name:2}rry
[root@centous1 ~]# echo ${name: -2}ry

基于模式取字符串;

${var#*word}:其中word是指定的分隔符;功能:自左而右,查找var變量所儲存的字符串中,第一次出現的word分隔符,刪除此分隔符至字符尾部之間的所有字符;${var##*word}:其中word是指定的分隔符;功能:自左而右,查找var變量所儲存的字符串中,最后一次出現的word分隔符,刪除此分隔符至字符尾部之間的所有字符;
[root@centous1 ~]# mypath="/etc/init.d/functions"[root@centous1 ~]# echo ${mypath#*/}etc/init.d/functions
[root@centous1 ~]# echo ${mypath##*/}functions

${var%word*}:其中word是指定的分隔符;功能:自右而左,查找var變量所儲存的字符串中,第一次出現的word分隔符,刪除此分隔符至字符尾部之間的所有字符;

${var%%word*}:其中word是指定的分隔符;功能:自右而左,查找var變量所儲存的字符串中,最后一次出現的word分隔符,刪除此分隔符至字符尾部之間的所有字符;

[root@centous1 ~]# echo ${mypath%/*}/etc/init.d
[root@centous1 ~]# url=http://www.magedu.com:80[root@centous1 ~]# echo ${url%%:*}http
[root@centous1 ~]# echo ${url##*:}80

注意 * 的位置

查找替換:

${var/PATTERN/SUBSTI}:查找var所表示的字符串中,第一次被PATTERN所匹配到的字符串,將其替換為SUBSSTI所表示的字符串;${var//PATTERN/SUBSTI}:查找var所表示的字符串中,第一次被PATTERN所匹配到的字符串,將其替換為SUBSSTI所表示的字符串;${var/#PATTERN/SUBSTI}:查找var所表示的字符串中,行首被PATTERN所匹配到的字符串,將其替換為SUBSSTI所表示的字符串;${var/%PATTERN/SUBSTI}:查找var所表示的字符串中,行尾被PATTERN所匹配到的字符串,將其替換為SUBSSTI所表示的字符串;

注意:PATTERN中使用golb風格和通配符;

查找刪除:

${var/PATTERN}:刪除匹配到的第一個

${var//PATTERN}:刪除全部匹配到的

${var/%PATTERN}:刪除匹配到的尾部那一個

${var/#PATTERN}:刪除匹配到的行首那一個

字符大小寫轉換:

${var^^}:把var中的所有轉換成大寫

 ${var,,}:把var中的所有轉換成大寫

變量賦值:

${var:-value}:如果var變量為空,或未設置,那么返回VALUE;否則,返回var變量的值;${var:=value}:如果var變量為空,或未設置,那么返回VALUE;并將VALUE的值賦給var;否則,返回var變量的值;${var:+value}:如果var變量不空,則返回VALUE;${var:?ERROR_INFO}:如果var為空,或未設置,那么返回ERROR_INFO為錯誤提示;否則,返回var的值;

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

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

相關推薦

  • shell編程之條件判斷和find查詢

    使用read 來把輸入值分配給一個或多個shell 變量: -p 指定要顯示的提示 -t TIMEOUT read 從標準輸入中讀取值,給每個單詞分配一個變量 所有剩余單詞都被分配給最后一個變量 read -p “Enter a filename: “ FILE   條件選擇if語句  多分支 if  CONDITION1 ; …

    Linux干貨 2016-08-18
  • ftp服務器介紹與配置

    一、 ftp服務,File Transfer Protocal 文件傳輸協議      1. ftp基于tcp協議,C/S架構          Server: wu-ftpd, proftpd ,pureftp,vsf…

    Linux干貨 2015-06-21
  • M22 wireshark使用方法簡介

    wireshark是一款著名的開源抓包軟件,它可以抓取網卡的數據包,以供網絡管理員分析。 一 安裝方法 debain系安裝方法: sudo add-apt-repository ppa:wireshark-dev/stable sudo apt update sudo apt install wireshark 啟動wireshark: sudo wires…

    2017-03-20
  • Linux運維學習歷程-第九天-bash腳本初步了解

    概述:   本章重點在于講解bash腳本的基礎知識,為今后學習使用bash腳本打下基礎 一、bash基礎特性         程序:指令+數據             指令:由程序文件提供         &n…

    Linux干貨 2016-08-18
  • Openssl加密解密原理+CA自建實現

     Openssl加密解密原理+CA自建實現     前言 互聯網的驚人發展使企業和消費者都感到非常興奮,它正改變著我們的生活和工作方式。但是,互聯網的安全程度如何——尤其是在通過它發送機密信息時的安全性——已經成為人們關心的主要問題。隨著時代的發展,加密原理也不斷地在更新換代. 數據的加密目前已廣泛地運用于戰爭,商業活…

    Linux干貨 2015-05-25
  • cp和ln命令簡述

    cp和軟ln命令簡述 cp          備注: 1.       該命令可以自動判斷你所復制的是文件還是目錄 2.       當源是一個文件,目標(目的…

    2017-08-19
欧美性久久久久