shell编程 - 数组

        之前一节,我们了解了字符串和整数。到目前为止,我们所接触到的数据类型在计算机科学领域被称为标量变量,也就是说,变量只包含一个单一值。

        本次我们学习一种包含多个值的数据结构——数组。事实上,数组几乎是所有程序设计语言的一大特点。尽管shell对数组的支持有限,但它对于解决程序设计问题是非常有帮助的。

什么是数组

        数组是可以一次存放多个值的变量。数组单元叫做元素,并且每个元素中含有数据。通过使用索引或叫下标就可以访问一个独立的数组元素。

        bash中的数据是一维的。

创建数组

        命名数组变量同命名其他bash变量一样,当访问数组变量时可以自动创建。

a[1]=foo

echo ${a[1]}

创建了数组a

declare -a a

declare命令创建数组a。

数组赋值

赋值的方式有两种。

        1、使用下面的语法结构可以赋单一值。

        name[subscript]=value

这里name是数组名,并且subscript是大于或等于0的整数。需要注意的是数组的第一个元素的subscript是0,而不是1。value是赋给数组元素的字符串或整数。

       2、使用下面的语法结构可以赋多值。

        name=(value1 value2 ...)

这里name是数组名,并且将value1 value2...等值依次赋予从下标0开始的数组元素。

例如,想要将一星期中天数的缩写赋给数组days,那么可以

days=(Sun Mon Tue Wed Thu Fri Sat)

通过为每个值指定一个下标来给特定元素赋值也是可以的

days=([0]=Sun [1]=Mon [2]=Tue [3]=Wed [4]=Thu [5]=Fri [6]=Sat)

访问数组元素

以一个简单的数据采集和表示为例。创建一个脚本,用于校验特定目录中文件的修改次数。

#!/bin/bash

# hours:script to count files by modification time

usage () {
    echo "Usage:$(basename $0) directory" >&2
}

# check that argument is a directory
if [[ ! -d $1 ]];then
    usage
    exit 1
fi

# initialize array
for i in {0..23};do hours[i]=0;done

# collect data
for i in $(stat -c %y "$1"/* | cut -c 12-13);do
    j=${i/#0}
    ((++hours[i]))
    ((++count))
done

# display data
echo -e "Hour\tFiles\tHour\tFiles"
echo -e "----\t----\t----\t----"
for i in {0..11};do
    j=$((i+12))
    printf "%02d\t%d\t%02d\t%d\n" $i ${hours[i]} $j ${hours[j]}
done
printf "\nTotal files = %d\n" $count

数组操作

        有很多常见的数组操作。比如打印出数组、确定数组元素的个数、查找数组元素的下标、在数组的结尾添加元素、数组排序操作、数组的删除(删除整个数组、删除单个数组元素等)。

输出数组的所有内容

我们可以使用下标“*”和“@”来访问数组中的每个元素。

#!/bin/bash
animals=("a dog" "a cat" "a fish")
for i in ${animals[*]};do echo $i;done
echo "-------------------------"
for i in ${animals[@]};do echo $i;done
echo "+++++++++++++++++++++++++"
for i in "${animals[*]}";do echo $i;done
echo "========================="
for i in "${animals[@]}";do echo $i;done

输出结果

a
dog
a
cat
a
fish
-------------------------
a
dog
a
cat
a
fish
+++++++++++++++++++++++++
a dog a cat a fish
=========================
a dog
a cat
a fish

        创建了数组animals,并使用3个双单词字符串作为数组元素,然后执行4个循环,观察单词拆分对数组内容的影响。

        如果对符号${animals[*]}和${animals[@]}加以引用,就会得到不同的结果。符号“*”将数组所有内容放在一个字符串中,而符号“@”使用3个字来显示数组的真是内容。

        "${animals[@]}"更能体现出数组内容的正确性,更加适用。

确定数组元素的个数

        使用参数扩展,我们可以采用类似获取字符串长度的方式来确定数组中元素的个数。

a[100]=foo
echo ${#a[@]} # number of array elements

echo ${#a[100]} # length of element 100

echo ${#a[@]}输出结果为1,表示数组a中的元素个数为1.

echo ${#a[100]}输出结果为3,表示下标为100的数组元素值的长度。

值得一提的是,当将字符串赋给下标100时,bash报告数组中只有一个元素。这与其他一些编程语言的行为是不同的,这些语言中,数组中未使用的下标(0~99)元素初始化为空值并参与数组长度计数。bash数组不同!!!

查找数组中使用的下标

        ${!array[*]}

        ${!array[@]}

这里,array是数组变量名。

foo=([2]=a [4]=b [6]=c)
for i in "${foo[@]}";do echo $i;done
# output:
# a
# b
# c
for i in "${!foo[@]}";do echo $i;done
# output:
# 2
# 4
# 6

在数组的结尾增加元素

        shell通过使用“+=”赋值运算符,可以在数组的尾部自动地添加元素。这里我们将3个值赋给数组foo,然后再添加3个元素。

foo=(a b c)
echo ${foo[@]}
# 输出:a b c
foo+=(d e f)
echo ${foo[@]}
# 输出:a b c d e f

数组排序操作

        shell没有直接的排序功能,但是可以用一些代码来完成。

#!/bin/bash

# array-sort:sort an array

a=(f e d c b a)
echo "Original array:${a[@]}" # 输出结果:Original array:f e d c b a
a_sorted=($(for i in "${a[@]}";do echo $i;done | sort))
echo "Sorted array:${a_sorted[@]}" # 输出结果:Sorted array:a b c d e f

脚本巧妙地使用一个替换命令将原数组a的内容复制到数组a_sorted中。

通过改变设计流程,我们可以将这个技术用来执行数组中的多种操作。

数组的删除

使用unset命令,我们可以删除数组。

foo=(a b c d e f)
echo ${foo[@]} # 输出 a b c d e f
unset foo
echo ${foo[@]} # 输出 空

也可以使用unset删除单个数组元素

foo=(a b c d e f)
echo ${foo[@]} # 输出 a b c d e f

unset 'foo[2]'
echo ${foo[@]} # 输出 a b d e f

对数组foo的第3个元素(下标为2)进行删除。记住!数组是以下标0开始的,而不是1开始的!同时需要注意的是,我们必须引用数组元素来阻止shell执行路径名扩展。

        很有趣的是,对数组变量进行赋空值,并不会清空数组内容。

foo=(a b c d e f)
foo=
echo ${foo[@]} # 输出 b c d e f

         任何涉及到不含下标的数组变量的引用指的是数组中的元素0,如下所示

foo=(a b c d e f)
echo ${foo[@]} # 输出 a b c d e f
foo=A
echo ${foo[@]} # 输出 A b c d e f

数组和循环经常结合使用,来解决多种程序设计问题。

Shell编程是指在Unix/Linux操作系统下,使用命令行界面或脚本语言编写一系列命令来完成特定任务的编程方式。其主要用途包括:

1. 系统管理:可以编写Shell脚本来自动化执行各种系统管理任务,如备份文件、安装软件、监控系统状态等。

2. 批处理:可以编写Shell脚本来批量处理文件、数据和日志等任务,提高效率和减少人工错误。

3. Web开发:可以使用Shell编写Shell脚本来自动化构建、测试和部署Web应用程序。

4. 数据处理:可以使用Shell编写Shell脚本来处理各种类型的数据,例如文本、XML、JSON和CSV等。

5. 安全审计:可以使用Shell编写Shell脚本来查找和修复系统安全漏洞,提高系统安全性。

总之,Shell编程可以帮助我们快速、高效地完成各种系统管理和数据处理任务,提高工作效率和准确性。


可以关注作者微信公众号,追踪更多有价值的内容! 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Shell字符串数组是一种存储多个字符串的数据结构,可以通过下标访问数组中的元素,也可以通过循环遍历数组中的所有元素。在Shell脚本中,可以使用declare命令或者直接赋值的方式来创建字符串数组。例如,使用declare命令创建一个包含三个字符串的数组: declare -a arr=("hello" "world" "shell") 然后可以通过下标访问数组中的元素: echo ${arr[]} # 输出hello 也可以使用循环遍历数组中的所有元素: for i in "${arr[@]}" do echo $i done 输出结果为: hello world shell ### 回答2: Shell中的字符串数组是一种特殊的变量类型,用于存储多个字符串。在Shell脚本中,字符串数组可以用于存储一系列相关的字符串,并且可以对其进行遍历、操作和处理。 定义字符串数组可以使用以下语法: ``` array=("string1" "string2" "string3") ``` 其中,array是数组的名称,而"string1"、"string2"、"string3"是数组中的元素。 也可以逐个添加元素到数组中: ``` array[0]="string1" array[1]="string2" array[2]="string3" ``` 访问数组元素可以使用以下语法: ``` element=${array[index]} ``` 其中,index是数组中元素的索引,element是获取的数组元素。 对于数组的长度,可以使用以下语法: ``` length=${#array[@]} ``` 使用这个语法,可以获取数组中元素的个数。 遍历字符串数组可以使用循环语句: ``` for element in "${array[@]}" do echo $element done ``` 这个例子中,通过遍历${array[@]},我们可以访问数组中的每个元素,并将其打印出来。 使用字符串数组,可以方便地存储和处理一系列相关的字符串数据,从而实现更加灵活和高效的脚本编写。 ### 回答3: Shell字符串数组Shell编程语言中的一种数据结构,它可以存储多个字符串,并通过索引访问和操作。在Shell中,字符串数组可以通过以下方式定义和初始化: ```bash my_array=("string1" "string2" "string3") ``` 上述代码定义了一个名为my_array的字符串数组,其中有三个元素,分别是"string1"、"string2"和"string3"。我们可以通过数组索引来访问特定的元素,如: ```bash echo ${my_array[0]} # 输出第一个元素"string1" echo ${my_array[1]} # 输出第二个元素"string2" echo ${my_array[2]} # 输出第三个元素"string3" ``` 我们还可以通过下标的方式遍历整个数组,并对每个元素进行操作,如: ```bash for element in ${my_array[@]}; do echo $element done ``` 上述代码会将数组中的每个元素逐行输出。 在Shell中,我们可以使用数组来存储需要进行批量处理的数据,方便对多个字符串进行统一操作,比如切割、连接等。同时,字符串数组还可以作为函数的参数传递,方便将多个字符串作为一个整体进行处理。总的来说,Shell字符串数组是一种非常有用的数据结构,可以简化Shell脚本编写,提高代码的可读性和维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值