Bash 数组教程:15 种不同的数组操作

举报
Tiamo_T 发表于 2022/02/15 18:52:24 2022/02/15
【摘要】 数组是包含多个值的变量,可以是相同类型或不同类型。数组的大小没有最大限制,也没有要求连续索引或分配成员变量,数组索引从零开始。 在本文中,让我们了解一下 bash 中的 15 种不同的数组操作。

数组是包含多个值的变量,可以是相同类型或不同类型。数组的大小没有最大限制,也没有要求连续索引或分配成员变量,数组索引从零开始。

在本文中,让我们了解一下 bash 中的 15 种不同的数组操作。

1. 声明一个数组并赋值

在 bash 中,当以如下格式使用变量时,会自动创建数组,

name[index]=value
  • name 是数组的任何名称
  • index 可以是必须计算为大于或等于零的数字的任何数字或表达式。您可以使用 declare -a arrayname 声明显式数组。
$ cat arraymanip.sh
#! /bin/bash
Unix[0]='Debian'
Unix[1]='Red hat'
Unix[2]='Ubuntu'
Unix[3]='Suse'

echo ${Unix[1]}

$./arraymanip.sh
Red hat

要访问数组中的元素,请使用大括号,例如 ${name[index]}。

2.声明时初始化数组

您可以通过在花括号中指定元素列表(由空格分隔)来声明和初始化数组,而不是单独初始化数组的每个元素。

Syntax:
declare -a arrayname=(element1 element2 element3)

如果元素有空格字符,请用引号将其括起来。

#! /bin/bash
$cat arraymanip.sh
declare -a Unix=('Debian' 'Red hat' 'Red hat' 'Suse' 'Fedora');

declare -a 声明一个数组,括号中的所有元素都是数组的元素。


3. 打印整个 Bash 数组

有不同的方法可以打印数组的整个元素。如果索引号是 @ 或 *,则引用数组的所有成员。您可以使用 bash 中的循环语句遍历数组元素并打印它。

echo ${Unix[@]}

# Add the above echo statement into the arraymanip.sh
#./t.sh
Debian Red hat Ubuntu Suse

在不提供索引号的情况下引用数组成员变量的内容与引用第一个元素的内容相同,第一个元素引用索引号为零。

4. Bash 数组的长度

我们可以使用名为 $# 的特殊参数来获取数组的长度。

${#arrayname[@]} 为您提供数组的长度。

$ cat arraymanip.sh
declare -a Unix=('Debian' 'Red hat' 'Suse' 'Fedora');
echo ${#Unix[@]} #Number of elements in the array
echo ${#Unix}  #Number of characters in the first element of the array.i.e Debian
$./arraymanip.sh
4
6

5.数组中第n个元素的长度

${#arrayname[n]} 应该给出数组中第 n 个元素的长度。

$cat arraymanip.sh
#! /bin/bash

Unix[0]='Debian'
Unix[1]='Red hat'
Unix[2]='Ubuntu'
Unix[3]='Suse'

echo ${#Unix[3]} # length of the element located at index 3 i.e Suse

$./arraymanip.sh
4

6. 数组的偏移量和长度提取

以下示例显示了从名为 Unix 的数组中提取从位置 3 开始的 2 个元素的方法。

$cat arraymanip.sh
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
echo ${Unix[@]:3:2}

$./arraymanip.sh
Suse Fedora

上面的示例返回第三个索引和第四个索引中的元素。索引总是从零开始。

7. 使用偏移量和长度提取数组的特定元素

仅从数组元素中提取前四个元素。例如,Ubuntu 位于数组的第二个索引处,您可以对数组的特定元素使用偏移量和长度。

$cat arraymanip.sh
#! /bin/bash

Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
echo ${Unix[2]:0:4}

./arraymanip.sh
Ubun

上面的示例从数组的第二个索引元素中提取前四个字符。

8. 在数组元素中查找和替换

以下示例在数组元素中搜索 Ubuntu,并将其替换为单词“SCO Unix”。

$cat arraymanip.sh
#!/bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');

echo ${Unix[@]/Ubuntu/SCO Unix}

$./arraymanip.sh
Debian Red hat SCO Unix Suse Fedora UTS OpenLinux

在此示例中,它将第二个索引“Ubuntu”中的元素替换为“SCO Unix”。但此示例不会永久替换数组内容。

9. 将元素添加到现有的 Bash 数组

以下示例显示了将元素添加到现有数组的方法。

$cat arraymanip.sh
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
Unix=("${Unix[@]}" "AIX" "HP-UX")
echo ${Unix[7]}

$./arraymanip.sh
AIX

在名为 Unix 的数组中,元素“AIX”和“HP-UX”分别添加到第 7 和第 8 个索引中。

10. 从数组中删除一个元素

unset 用于从数组中删除元素。unset 与将 null 分配给元素具有相同的效果。

$cat arraymanip.sh
#!/bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');

unset Unix[3]
echo ${Unix[3]}

上面的脚本将只打印 null ,这是第三个索引中可用的值。以下示例显示了从数组中完全删除元素的一种方法。

$ cat arraymanip.sh
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
pos=3
Unix=(${Unix[@]:0:$pos} ${Unix[@]:$(($pos + 1))})
echo ${Unix[@]}

$./arraymanip.sh
Debian Red hat Ubuntu Fedora UTS OpenLinux

在此示例中, ${Unix[@]:0:$pos} 将为您提供从第 0 个索引开始的 3 个元素,即 0,1,2 和 ${Unix[@]:4} 将提供从第 4 个索引到最后一个索引。并合并上述两个输出。这是从数组中删除元素的解决方法之一。

11. 使用模式删除 Bash 数组元素

在搜索条件中,您可以给出模式,并将剩余元素存储到另一个数组中,如下所示。

$ cat arraymanip.sh
#!/bin/bash
declare -a Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora');
declare -a patter=( ${Unix[@]/Red*/} )
echo ${patter[@]}

$ ./arraymanip.sh
Debian Ubuntu Suse Fedora

上面的示例删除了具有模式 Red* 的元素。

12. 复制数组

展开数组元素并将其存储到一个新数组中,如下所示。

#!/bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
Linux=("${Unix[@]}")
echo ${Linux[@]}

$ ./arraymanip.sh
Debian Red hat Ubuntu Fedora UTS OpenLinux

13. 两个 Bash 数组的串联

展开两个数组的元素并将其分配给新数组。

$cat arraymanip.sh
#!/bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
Shell=('bash' 'csh' 'jsh' 'rsh' 'ksh' 'rc' 'tcsh');

UnixShell=("${Unix[@]}" "${Shell[@]}")
echo ${UnixShell[@]}
echo ${#UnixShell[@]}

$ ./arraymanip.sh
Debian Red hat Ubuntu Suse Fedora UTS OpenLinux bash csh jsh rsh ksh rc tcsh
14

它打印包含数组“Unix”和“Shell”元素的数组,新数组的元素数为 14。

14. 删除整个数组

unset 用于删除整个数组。

$cat arraymanip.sh
#!/bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
Shell=('bash' 'csh' 'jsh' 'rsh' 'ksh' 'rc' 'tcsh');

UnixShell=("${Unix[@]}" "${Shell[@]}")
unset UnixShell
echo ${#UnixShell[@]}

$ ./arraymanip.sh
0

取消设置数组后,其长度将为零,如上所示。

15. 将文件的内容加载到数组中

您可以将文件的内容逐行加载到数组中。

#Example file
$ cat logfile
Welcome
to
tiamo
Linux
Unix

$ cat loadcontent.sh
#!/bin/bash
filecontent=( `cat "logfile" `)

for t in "${filecontent[@]}"
do
echo $t
done
echo "Read file content!"

$ ./loadcontent.sh
Welcome
to
tiamo
Linux
Unix
Read file content!

在上面的示例中,数组元素的每个索引都通过 for 循环打印出来。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。