精华内容
参与话题
问答
  • shell中的数组

    万次阅读 2015-10-17 16:57:33
    shell中的数组shell作为一门语言那肯定是不能缺少数组了,下面记录了shell中数组的一些相关内容。 Bash 提供了一维数组变量。任何变量都可以作为一个数组;内建命令 declare 可以显式地定义数组。数组的大小没有...

    shell中的数组


    shell作为一门语言那肯定是不能缺少数组了,下面记录了shell中数组的一些相关内容。

    Bash 提供了一维数组变量。任何变量都可以作为一个数组;内建命令 declare 可以显式地定义数组。数组的大小没有上限,也没有限制在连续对成员引用和赋值时有什么要求。数组以整数为下标,从 0 开始。

    1. 定义和初始化数组

    下面的示例总结了如何定义一个数组和如何来初始化数组:

    declare -a array #显示声明了数组array
    delcare -a array[10] #数组大小没有上限,所以定义时指定的大小会被忽略
    array[key]=value #array[0]=one,array[1]=two
    array=(value1 value2...) #value的形式都是[subscript]=string,下标和等号可以省略,示例如下。
    array=(value1 value2 value3) #array[0]=value1,array[1]=value2,array[2]=value3
    array=([0]=value1 [2]=value3 [3]=value[4])

    从上面来看数组的定义也是非常灵活多变的,能够满足我们大部分的需求,跟其其它语言最大的区别就是shell中的数组大小没有上限,也可以理解为数组是动态的。

    2. 数组的访问

    数组的任何元素都可以用${array[subscript]}来引用,花括号是必须的,以避免和路径扩展冲突。
    如果 subscript 是@或是*,它扩展为array的所有成员。这两种下标只有在双引号中才不同。在双引号中,${name[*]}扩展为一个词,由所有数组成员的值组成,用特殊变量IFS的第一个字符分隔数组成员;${array[@]}将array的每个成员扩展为一个词。 如果数组没有成员,${name[@]} 扩展为空串。

    #!/bin/bash
    
    arr=("one" "two")
    for i in "${arr[*]}"
    do
        echo ${i}
    done

    上面的示例代码的输出结果如下:

    lxg@lxg-X240:~/station/shell$ sh ./array.sh
    one two

    #!/bin/bash
    
    arr=("one" "two")
    for i in "${arr[@]}"
    do
        echo ${i}
    done
    

    上面的示例代码的输出结果如下:

    lxg@lxg-X240:~/station/shell$ sh ./array.sh
    one
    two

    3. 数组的删除

    用unset来进行数组的删除,示例如下:

    unset array[2] #删除第三个成员
    unset array #删除整个数组

    4. 数组的长度

    ${#arr[@]}
    ${#arr[*]}
    ${#arr} #错误的。这个获取的是数组第一个成员的长度。

    5. 数组的”切片”操作

    获取数组的“子串“用${arr[@]:n:m}来表示,如果没有:m那么就获取从下标n开始到最后一个元素的“字串“,示例如下:

    #!/bin/bash
    
    echo ${arr[@]:2}
    echo ${arr[@]:1:3}
    echo ${arr[@]:0}

    输出如下:

    three four
    two three four
    oner two three four

    6. 关联数组

    shell中还可以声明一个关联数组,普通数组只能使用整数作为数组的索引,而关联数组则使用字符串作为数组的索引。这个关联数组是不是有点其它语言中的字典的意思呢,o(∩∩)o…哈哈

    #!/bin/bash
    
    declare -A ass_arr
    ass_arr["apple"]=12
    ass_arr["orange"]=19
    
    for t in "${ass_arr[@]}"
    do
        echo ${t}
    done
    
    echo "ass_arr[\"orange\"]="${ass_arr["orange"]}

    上面的示例输出如下:

    19
    12
    ass_arr[“orange”]=19

    从上面的输出来看关联数组输出的顺序跟普通数组有一些不同,关联数组是从最后一个成员开始输出。
    关联数组使用字符串作为索引,有时候我们需要获取数组的所有索引,可以用如下的方式来获取:

    #!/bin/bash
    
    declare -A ass_arr
    ass_arr["apple"]=12
    ass_arr["orange"]=19
    
    echo ${!ass_arr[@]} #or ${!ass_arr[*]}

    输出如下:

    apple orange

    展开全文
  • Shell中的数组

    2014-06-19 23:55:46
    str=“a b c” Array = ($str) echo$Array[1],同样输出b,要注意: Array = ($str)中的右值的括号不能缺 上面这个就是我们常说的把字符串放到一个数组中,也可以理解为动态数组,比C和C++简单多了 计算字符串...

    二维数组:

    构造成这样:a=(1 2 3 4 5 6 7 8 9),然后操作的时候利用第i行j列的元素等于i*len+j,len是数组的第二维度大小,这样做有时候更简单,但是就必须得控制一下边界了,比如3*3的数组,你可能初始化只给出8个元素。



    一、数组和字符串
    Array[3] = "a b c" echo $Array[1]  输出b,
    str=“a b c” Array = ($str) echo$Array[1],同样输出b,要注意: Array = ($str)中的右值的括号不能缺
    上面这个就是我们常说的把字符串放到一个数组中,也可以理解为动态数组,比C和C++简单多了

    计算字符串长度可用的三种方法:
    echo “$str”|awk '{print length($0)}'
    expr length “$str”
    echo “$str”|wc -c
    但是第三种得出的值会多1,可能是把结束符也计算在内了

    判断字符串为空的方法有三种:
    if [ "$str" =  "" ] 
    if [ x"$str" = x ]
    if [ -z "$str" ] 
    二、其他类型的数组
    arr=(123 34 3 5) echo $arr,输出123,在这里等同于echo ${arr[0]};
    echo ${arr[1]},输出34,注意格式,除了首地址,必须要加上{},否则会出错
    三、数组的长度和遍历
    length=${#array[@]}----数组的长度,这里的长度是最大下标
    echo ${array[@]}-------输出数组全部元素
    array[1]=5--------------向数组的某个元素赋值和标c的语法一样
    echo ${array[@]:1:2}---输出的是array[0]和array[1]的值
    echo ${array[@]:2}-----输出数组第三个元素以后的值
    echo ${array[@]::2}-----输出数组下标小于2的值
    $ echo ${#array[3]} ----取得元素3的长度
    unset array--------------清除array
    array=------------------清空array,赋给array空值

    遍历字符串方法一
    for ((i=0;i<${#array[@]};i++))
    do
       echo ${array[$i]}
    done

    遍历字符串方法二
    str="a --m"
    for i in $str
    do
    echo $i
    done

    用while遍历
    len=${#arr[@]}
    i=0
    while [ $i -lt $len ]
    do
    echo ${arr[$i]}
    let i++
    done

    四、其他:
    Array[3] = "a b c"和Array[3] = a b c这两个是等价的;如果Array[3] = "a "bc"",想要查找",用awk是找不到的,单引号
    是可以找到的,就是双引号找不到;我们可以用截取字符串的方法来判断是否双引号,截取的字符串的方法如下:
    ${varible##*string} 从左向右截取最后一个string后的字符串
    ${varible#*string}从左向右截取第一个string后的字符串
    ${varible%%string*}从右向左截取最后一个string后的字符串
    ${varible%string*}从右向左截取第一个string后的字符串
    将上面的string换成“即可,然后在判断字符串的长度,如果相等就是没有,如果不相等就是有双引号,不可以
    用更改数组分隔符的方法,那样做无效,这个双引号是shell内建的符号。

    通用的awk查找方法,例如:
    find=`echo {${arr[$i]}|awk 'BEGIN{FS=""}{for(i=1;i<=NF;i++) if($i==";") print $i}'`;
    也可以用math和index方法,例如:flag=`echo {$line}|awk '{print match($0,"channel")}'` 
    数组默认的分隔符是空格,如果想改变默认的分隔符,用下面的方法
    str="abd#ddd#ff";str2=($(echo $str|tr ''#''|tr -s ''));


    本帖最后由 haokanwk 于 2010-09-03 14:47 编辑

    不知道 是什么时候写的东西,整理文档时被考古发现,给那些闲着蛋疼之人,一笑而过吧。如果本文中的错误给您带来所有的精神损失,请找保险公司理陪!当然你可以告诉我 (倾诉) 

    数组作为一种特殊的数据结构在任何一种编程语言中都有它的一席之地,当然bash shell也不例外。本文就shell数组来做一个小的总结。
    在这里只讨论一维数组的情况,关于多维数组(事实上,你得用一维数组的方法来模拟),不涉及。这里包括数组的复制,计算,删除,替换。

    数组的声明:
    1. 1)array[key]=value # array[0]=one,array[1]=two
    复制代码
    1. 2)declare -a array # array被当作数组名
    复制代码
    1. 3)array=( value1 value2 value3 ... )
    复制代码
    1. 4)array=( [1]=one [2]=two [3]=three ... )
    复制代码
    1. 5)array="one two three" # echo ${array[0|@|*]},把array变量当作数组来处理,但数组元素只有字符串本身
    复制代码
    数组的访问:
    1. 1)${array[key]} # ${array[1]}
    复制代码
    数组的删除
    1. 1)unset array[1] # 删除数组中第一个元素
    复制代码
    1. 2)unset array # 删除整个数组
    复制代码
    计算数组的长度:
    1. 1)${#array}
    复制代码
    1. 2)${#array[0]} #同上。 ${#array[*]} 、${#array[@]}。注意同#{array:0}的区别
    复制代码
    数组的提取
    从尾部开始提取:
    array=( [0]=one [1]=two [2]=three [3]=four )
    ${array[@]:1} # two three four,除掉第一个元素后所有元素,那么${array[@]:0}表示所有元素
    ${array[@]:0:2} # one two
    ${array[@]:1:2} # two three

    子串删除
    1. [root@localhost dev]# echo ${array[@]:0}
    2. one two three four
    复制代码
    1. [root@localhost dev]# echo ${array[@]#t*e} # 左边开始最短的匹配:"t*e",这将匹配到"thre"
    2. one two e four
    复制代码
    1. [root@localhost dev]# echo ${array[@]##t*e} # 左边开始最长的匹配,这将匹配到"three"
    复制代码
    1. [root@localhost dev]# array=( [0]=one [1]=two [2]=three [3]=four )
    复制代码
    1. [root@localhost dev]# echo ${array[@] %o} # 从字符串的结尾开始最短的匹配
    2. one tw three four
    复制代码
    1. [root@localhost dev]# echo ${array[@] %%o} # 从字符串的结尾开始最长的匹配
    2. one tw three four
    复制代码
    子串替换
    1. [root@localhost dev]# array=( [0]=one [1]=two [2]=three [3]=four )
    复制代码
    第一个匹配到的,会被删除
    1. [root@localhost dev]# echo ${array[@] /o/m}
    2. mne twm three fmur
    复制代码
    所有匹配到的,都会被删除
    1. [root@localhost dev]# echo ${array[@] //o/m}
    2. mne twm three fmur
    复制代码
    没有指定替换子串,则删除匹配到的子符
    1. [root@localhost dev]# echo ${array[@] //o/}
    2. ne tw three fur
    复制代码
    替换字符串前端子串
    1. [root@localhost dev]# echo ${array[@] /#o/k}
    2. kne two three four
    复制代码
    替换字符串后端子串
    1. [root@localhost dev]# echo ${array[@] /%o/k}
    2. one twk three four
    复制代码

    展开全文
  • shell 中的数组

    2018-12-20 10:03:49
    1, 定义数组 arr=(1 2 3) arr2=("a" "b" "c") 2, 获取基本数据:arrLen,arr[i] 3, 遍历元素

    1, 定义数组

    arr=(1 2 3)
    arr2=("a" "b" "c")
    

    2, 获取基本数据:arrLen,arr[i]

    在这里插入图片描述

    3, 遍历元素

    在这里插入图片描述

    展开全文
  • SHELL 中的数组

    2015-04-26 09:43:31
    # 定义一个数组 ARR_NAME="shardb_server login_server world_server gateway_server log_server" # 显示整个数组 printf '${ARR_NAME[*]} = ' echo ${ARR_NAME[*]} # 声明数组 declare -a SVRS i=0 for NAME in ${...

    <span style="font-size:18px;"># 定义一个数组
    ARR_NAME="shardb_server login_server world_server gateway_server log_server"
    # 显示整个数组
    printf '${ARR_NAME[*]} = '
    echo ${ARR_NAME[*]}
    # 声明数组
    declare -a SVRS
    i=0
    for NAME in ${ARR_NAME}
    do
        SVRS[${i}]=${NAME}_${ID}
        i=${i}+1
    done
    printf '${SVRS[*]} = '
    echo ${SVRS[*]}</span>







    展开全文
  • shell 中的数组

    2014-03-10 14:22:12
    1:定义(以空格分隔) array=('a' 'b') //下标从0开始  2:查看所有元素 echo ${array[*]}  ... 4:得到数组长度 echo ${#array[@]} //@可以用*代替  得到第0个元素长度 echo ${#array[0]...
  • Shell中的数组及其相关操作

    万次阅读 多人点赞 2016-07-26 19:04:54
    Shell中的数组不像JAVA/C,只能是一维数组,没有二维数组;数组元素大小无约束,也无需先定义数组的元素个数;但其索引则像JAVA/C/Python,从0开始,下面其常用的方式进行总结.   【数组声明】 ...
  • 把awk中的数组赋值给shell中的数组

    千次阅读 2017-05-17 16:06:56
    把awk中的数组赋值给shell中的数组 博客分类: linux/shell/sed/awk CC++C#JavaScriptBash  方法1,通过eval Shell代码 #!/bin/bash ipstr="192.168.1.152,192.168.1.153"; #declare -a ...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...

空空如也

1 2 3 4 5 ... 20
收藏数 2,353
精华内容 941
关键字:

shell中的数组