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 循环打印出来。
- 点赞
- 收藏
- 关注作者
评论(0)