菜鸟教程 -- 学的不仅是技术,更是梦想!

Linux 教程
(追記) (追記ここまで)

Shell 数组

数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)。

与大部分编程语言类似,数组元素的下标由 0 开始。

Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:

array_name=(value1 value2 ... valuen)

实例

创建一个简单的数组 my_array:

实例

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

my_array=(A B "C" D)

我们也可以使用数字下标来定义数组:

实例

array_name[0]=value0
array_name[1]=value1
array_name[2]=value2

读取数组

读取数组元素值的一般格式是:

${array_name[index]}

以下实例通过数字索引读取数组元素:

实例

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

my_array=(A B "C" D)

echo "第一个元素为: ${my_array[0]}"
echo "第二个元素为: ${my_array[1]}"
echo "第三个元素为: ${my_array[2]}"
echo "第四个元素为: ${my_array[3]}"

执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh
第一个元素为: A
第二个元素为: B
第三个元素为: C
第四个元素为: D

关联数组

Bash 支持关联数组,可以使用任意的字符串、或者整数作为下标来访问数组元素。

关联数组使用 declare 命令来声明,语法格式如下:

declare -A array_name

-A 选项就是用于声明一个关联数组。

关联数组的键是唯一的。

以下实例我们创建一个关联数组 site,并创建不同的键值:

实例

declare -A site=(["google"]="www.google.com" ["runoob"]="www.runoob.com" ["taobao"]="www.taobao.com")

我们也可以先声明一个关联数组,然后再设置键和值:

实例

declare -A site
site["google"]="www.google.com"
site["runoob"]="www.runoob.com"
site["taobao"]="www.taobao.com"

也可以在定义的同时赋值:

访问关联数组元素可以使用指定的键,格式如下:

array_name["index"]

以下实例我们通过键来访问关联数组的元素:

实例

declare -A site
site["google"]="www.google.com"
site["runoob"]="www.runoob.com"
site["taobao"]="www.taobao.com"

echo ${site["runoob"]}

执行脚本,输出结果如下所示:

www.runoob.com

获取数组中的所有元素

使用 @* 可以获取数组中的所有元素,例如:

实例

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D

echo "数组的元素为: ${my_array[*]}"
echo "数组的元素为: ${my_array[@]}"

执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh
数组的元素为: A B C D
数组的元素为: A B C D

实例

declare -A site
site["google"]="www.google.com"
site["runoob"]="www.runoob.com"
site["taobao"]="www.taobao.com"

echo "数组的元素为: ${site[*]}"
echo "数组的元素为: ${site[@]}"

执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh
数组的元素为: www.google.com www.runoob.com www.taobao.com
数组的元素为: www.google.com www.runoob.com www.taobao.com

在数组前加一个感叹号 ! 可以获取数组的所有键,例如:

实例

declare -A site
site["google"]="www.google.com"
site["runoob"]="www.runoob.com"
site["taobao"]="www.taobao.com"

echo "数组的键为: ${!site[*]}"
echo "数组的键为: ${!site[@]}"

执行脚本,输出结果如下所示:

数组的键为: google runoob taobao
数组的键为: google runoob taobao

获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同,例如:

实例

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D

echo "数组元素个数为: ${#my_array[*]}"
echo "数组元素个数为: ${#my_array[@]}"

执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh
数组元素个数为: 4
数组元素个数为: 4
AI 思考中...

8 篇笔记 写笔记

  1. #0

    飞雪敛梦

    409***[email protected]

    62

    数组的值也可以写入变量。

    例如:

    A=1
    my_array=($A B C D)
    echo "第一个元素为: ${my_array[0]}"
    echo "第二个元素为: ${my_array[1]}"
    echo "第三个元素为: ${my_array[2]}"
    echo "第四个元素为: ${my_array[3]}"

    输出为:

    第一个元素为: 1第二个元素为: B第三个元素为: c第四个元素为: D

    飞雪敛梦

    409***[email protected]

    9年前 (2017年09月20日)
  2. #0

    leocll

    leo***@qq.com

    48

    根据数组元素索引获取该数组元素值时,数组下标可为变量。

    例如:

    arr=(a b c d)
    i=2
    echo ${arr[i]}

    输出为:

    c

    leocll

    leo***@qq.com

    9年前 (2017年09月28日)
  3. #0

    百晓生_沙

    zhe***[email protected]

    103

    看数组的时候,觉得遍历数组用的比较多,所以自己试着写了写遍历,同时试了一下在SHELL脚本中的变量自增几个写法,在就新手学习的时候注意一下 [ 和 $ 之间要有空格,没有空格运行会报错,新手可能不太注意这一点,我开始就没注意到〜〜〜〜

    示例如下:

    #!/bin/bash
    my_arry=(a b "c","d" abc)
    echo "-------FOR循环遍历输出数组--------"
    for i in ${my_arry[@]};
    do
     echo $i
    done
    echo "-------::::WHILE循环输出 使用 let i++ 自增:::::---------"
    j=0
    while [ $j -lt ${#my_arry[@]} ]
    do
     echo ${my_arry[$j]}
     let j++
    done
    echo "--------:::WHILE循环输出 使用 let "n++ "自增: 多了双引号,其实不用也可以:::---------"
    n=0
    while [ $n -lt ${#my_arry[@]} ]
    do
     echo ${my_arry[$n]}
     let "n++"
    done
    echo "---------::::WHILE循环输出 使用 let m+=1 自增,这种写法其他编程中也常用::::----------"
    m=0
    while [ $m -lt ${#my_arry[@]} ]
    do
     echo ${my_arry[$m]}
     let m+=1
    done
    echo "-------::WHILE循环输出 使用 a=$[$a+1] 自增,个人觉得这种写法比较麻烦::::----------"
    a=0
    while [ $a -lt ${#my_arry[@]} ]
    do
     echo ${my_arry[$a]}
     a=$[$a+1]
    done

    百晓生_沙

    zhe***[email protected]

    9年前 (2017年12月05日)
  4. #0

    shita09

    shi***[email protected]

    21

    Bourne shell(原生kernel下)下不支持数组,只能通过模拟来实现类似数组功能。

    实例 1

    #!/bin/sh
    #注意不是/bin/bash
    echo "##############使用eval函数###############"
    echo "使用参考:"
    echo "http://www.runoob.com/linux/linux-comm-eval.html"
    eval a1=bili
    eval a2=nico
    eval a3=yama
    for i in 1 2 3 ; do
     eval echo "\$a$i"
    done

    输出结果:

    ##############使用eval函数###############
    使用参考:
    http://www.runoob.com/linux/linux-comm-eval.html
    bili
    nico
    yama

    实例 2

    #!/bin/sh
    #注意不是/bin/bash
    echo "##########################################"
    echo "指令参考:"
    echo "http://www.runoob.com/linux/linux-comm-expr.html"
    :<<!
    根据用户输入的一句话来定义数组
    并遍历数组元素
    !
    echo "输入字符串(以空格分开):"
    read str
    i=0
    for word in $str; do
     i=`expr $i + 1`
     eval a$i="$word"
     eval echo "数组的第 $i 个元素为: \$a$i"
    done

    输出结果:

    ##########################################
    指令参考:
    http://www.runoob.com/linux/linux-comm-expr.html
    输入字符串(以空格分开):
    runoob google taobao
    数组的第 1 个元素为: runoob
    数组的第 2 个元素为: google
    数组的第 3 个元素为: taobao

    shita09

    shi***[email protected]

    8年前 (2018年11月21日)
  5. #0

    陈东谱

    232***[email protected]

    23

    用 for 循环遍历数组:

    #!/bin/bash
     arr=(1 2 3 4 5 6 7 8 9 10)
     for a in ${arr[*]}
     do
     echo $a
     done

    陈东谱

    232***[email protected]

    7年前 (2019年10月27日)
  6. #0

    Vivienne

    122***[email protected]

    17

    字符串转数组:

    #!/bin/bash
    words="aaa bbb ccc"
    #字符串转数组,空格是分隔符
    array=(${words// / })
    #打印数组最后一个成员
    echo ${array[${#array[*]}-1]}
    #打印数组长度
    echo ${#array[*]}
    #字符串不转换为数组,在循环实现以空格为分隔符打印每个成员
    for word in ${words}; do
     echo ${word}
    done
    运行结果:

    ccc3aaabbbccc

    Vivienne

    122***[email protected]

    6年前 (2020年10月20日)
  7. #0

    菜农

    414***[email protected]

    11

    使用 while 循环来遍历数组,对于顺序填满的数组来说,这个没有问题,然而,有些人会忽视另外一种情况,例如:

    my_array[0]=1
    my_array[1]=2
    my_array[20]=100

    如果使用查询数组长度,这时候数组的长度不是 21,也一样是 3,如果用数组长度来控制输出的方法,这时,输出是:

    a=1
    b=2
    c=100
    d=99
    array=($a $b $c $d)
    echo ${array[*]}
    array[20]=verilog
    echo -e "use while && let ++ print every element"
    i=0
    while [ $i -lt ${#array[@]} ]
    do
     echo ${array[$i]}
     let i++
    done
    echo "*******************"

    运行结果是:

    use while && let ++ print every element
    1
    2
    100
    99
    *******************

    菜农

    414***[email protected]

    5年前 (2021年07月01日)
  8. #0

    RosenYin

    l23***[email protected]

    20

    字符串替换

    使用 string/pattern/string 进行首个 pattern 的替换

    > string="text, dummy, text, dummy"
    > echo ${string/text/TEXT}
    TEXT, dummy, text, dummy

    使用 string//pattern/string 进行全部 pattern 的替换

    > string="text, dummy, text, dummy"
    > echo ${string//text/TEXT}
    TEXT, dummy, TEXT, dummy
    RosenYin

    RosenYin

    l23***[email protected]

    4年前 (2022年05月27日)

点我分享笔记

  • 昵称 (必填)
  • 邮箱 (必填)
  • 引用地址

AltStyle によって変換されたページ (->オリジナル) /