shell script 数组使用[定义、遍历、函数传参]

前言

在编写 shell script 时候,有时需要定将数组作为参数传递函数。
下面是将和 shell 中数组相关的知识点做一个简单的梳理,方便后面查阅。

shell 数组定义

数组定义主要有下面几种方式:

declare -a arrayOfPort        #定义一个数组,名字是arrayOfPort
arrayOfPort[0]=21; arrayOfPort[1]=23; arrayOfPort[2]=80; arrayOfPort[3]=8080  #即array[key]=value形式
arrayOfPort=(21 23 80 8080)   #直接初始化
arrayOfPort=([0]=21 [1]=23 [2]=80 [4]=8080)

arrayOfPort="21 23 80 8080"   #定义字符串
echo ${arrayOfPort[0]}        #可以把arrayOfPort变量当作数组来处理
echo ${arrayOfPort[@]}        #可以把arrayOfPort变量当作数组来处理
echo ${arrayOfPort[*]}        #可以把arrayOfPort变量当作数组来处理

获取数组元素

${arrayOfPort[0]}${arrayOfPort[1]}     #获取数组元素
str=${arrayOfPort[*]}                    #以空格分隔各数组字符串

str=aa" "bbb" "cccc; arrayOfStr=($str);  #空格分隔的字符串转换成数组,不太推荐
echo ${#arrayOfStr[@]};                  #获取arrayOfStr数组长度 3
echo ${arrayOfStr[@]};                   #输出arrayOfStr数组内容 aa bbb cccc

str=$(ls ./); arrayOfDir=($str)          #可以把 `ls`,`find` 等命令的返回值转换成数组
arrayOfDir=($(ls ./))                    #和上面一行命令等价

获取数组长度

获取数组长度的方法主要有下面几种:

arrayOfPort=(21 23 80 8080)   #定义并初始化arrayOfPort

${#arrayOfPort[@]}            #获取数组arrayOfPort个数
${#arrayOfPort[*]}            #获取数组arrayOfPort个数

删除数组元素

arrayOfPort=(21 23 80 8080)   #定义并初始化arrayOfPort

unset arrayOfPort[1]          #删除数组arrayOfPort中第一个元素
unset arrayOfPort             #删除整个arrayOfPort数组

遍历数组元素

下面已 for 循环举例来看下如何遍历数组元素。

#!/bin/sh
#Traversing the array of arrayOfPort

##################################
# main function define
##################################
main()
{
    local param=0

    arrayOfPort=(21 23 80 8080)
    #arrayOfPort[0]=21; arrayOfPort[1]=23; arrayOfPort[2]=80; arrayOfPort[3]=8080 
    #arrayOfPort=([0]=21 [1]=23 [2]=80 [4]=8080)
    echo -e "arrayOfPort is "
    for i in ${arrayOfPort[*]}
    do
        echo -e "${i} "
    done

    return $param
}

main $@

上面的例子执行结果为:

[root@localhost ~]# ./arrayOfPort.sh
arrayOfPort is
21
23
80
8080

数组作为函数参数

个别场景需要将数组作为参数,传递给函数。

#!/bin/sh
#Traversing the array of arrayOfPort by function

##################################
# foo function define
##################################
foo()
{
    local param=0
    
    echo -e "print the array "
    
    local localArrayOfPort=${1}
    for i in ${localArrayOfPort[*]}
    do
        echo -e "${i} "
    done
    
    return $param
}

##################################
# main function define
##################################
main()
{
    local param=0

    arrayOfPort=(21 23 80 8080)
    #arrayOfPort[0]=21; arrayOfPort[1]=23; arrayOfPort[2]=80; arrayOfPort[3]=8080 
    #arrayOfPort=([0]=21 [1]=23 [2]=80 [4]=8080)
    echo -e "print the arrayOfPort"
    
    #foo $arrayOfPort         #这样子传参,只是将arrayOfPort[数组名]称传递过去,而不是数组本身。
    foo "${arrayOfPort[*]}"   #正确的写法

    return $param
}

main $@

上面的例子执行结果为:

[root@localhost ~]# ./arrayOfPort.sh
print the arrayOfPort
print the array
21
23
80
8080
<think>好的,我现在需要帮助用户了解如何在Shell脚本中定义数组并通过for循环遍历。首先,我要回忆一下Shell数组的基本用法,特别是Bash,因为不同的Shell可能有不同的语法。用户提到的是Shell脚本,所以假设是Bash环境。 首先,定义数组。在Bash中,数组可以使用括号来初始化,元素之间用空格分隔。例如:array=(element1 element2 element3)。要注意的是,如果元素中有空格,需要使用引号包裹,比如array=("element 1" "element 2")。 接下来是遍历数组。用户想用for循环,所以需要知道Bash中如何遍历数组。基本的语法是for element in "${array[@]}",这里使用双引号和@来确保每个元素被正确解析,尤其是包含空格的时候。然后循环体内处理每个元素,比如打印出来。 另外,用户可能需要知道如何通过索引来遍历数组。这时候可以用C风格的for循环,通过数组的索引来访问元素。数组的索引从0开始,长度可以通过${#array[@]}获取。例如:for ((i=0; i<${#array[@]}; i++)); do echo "${array[$i]}"; done。 还要注意不同的Shell版本可能对数组的支持不同,比如Bash 4之后支持关联数组,但用户可能只是需要普通数组。此外,如果用户使用的是非BashShell,比如sh,可能不支持数组,这时候需要确认他们使用的是Bash。 然后,根据用户提供的考引用,其中有一个关于Perl的while循环和Scala初始化数组的例子,可能和问题关联不大。但引用[3]提到Scala中初始化数组元素的方法,可能帮助确认数组初始化的通用概念。不过Shell数组语法和这些语言不同,需要明确区分。 用户可能需要示例代码来更好地理解。因此,我应该提供一个定义数组的示例,以及两种遍历方式:直接遍历元素和通过索引遍历。同时,要指出处理带空格元素时的注意事项,比如正确使用引号。 最后,生成相关问题,帮助用户进一步学习。比如如何添加元素到数组,如何获取数组长度,如何处理带空格的元素,以及不同Shell之间的差异。 总结步骤: 1. 定义数组的语法。 2. 遍历数组的两种方法:直接元素遍历和索引遍历。 3. 处理元素中的空格。 4. 示例代码。 5. 相关问题。 需要确保所有的命令和语法正确,符合Bash的标准。同时,用中文清晰解释每个步骤,避免术语混淆。</think>在Shell脚本中定义数组并通过`for`循环遍历的步骤如下: --- ### **1. 定义数组** Shell(如Bash)中数组定义格式为: ```bash array_name=("元素1" "元素2" "元素3") ``` **注意**: - 元素用空格分隔,若元素包含空格需用引号包裹 - 支持混合类型(数字、字符串等) 示例: ```bash fruits=("apple" "banana" "orange with peel" "grape") ``` --- ### **2. 遍历数组的两种方法** #### **方法1:直接遍历元素** ```bash for item in "${array_name[@]}"; do echo "$item" done ``` - `@` 表示所有元素 - 双引号确保带空格的元素被正确解析 #### **方法2:通过索引遍历** ```bash for ((i=0; i<${#array_name[@]}; i++)); do echo "${array_name[$i]}" done ``` - `${#array_name[@]}` 获取数组长度 - `${array_name[$i]}` 访问第`i`个元素 --- ### **完整示例** ```bash #!/bin/bash # 定义数组 colors=("red" "green" "blue" "yellow with stripes") # 方法1:直接遍历元素 echo "直接遍历:" for color in "${colors[@]}"; do echo "Color: $color" done # 方法2:通过索引遍历 echo "索引遍历:" for ((i=0; i<${#colors[@]}; i++)); do echo "Color $i: ${colors[$i]}" done ``` --- ### **3. 处理带空格的元素** 若元素包含空格,需在定义和引用时使用双引号,否则会被拆分为多个元素。例如: ```bash # 错误定义(不处理空格) broken_array=(hello world "good morning") # 正确定义使用引号) correct_array=("hello world" "good morning") ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值