如果在 bash 脚本中需要多个变量,该怎么办?假设我们要创建一个 bash 脚本,从用户那里读取 100 个不同的输入,那么需要创建 100 个变量吗?肯定不是这样,我们需要使用数组。
在前面的文章中,我们介绍了如何在 bash 中使用有限数量的变量,比如要保存一个或两个文件名或用户名。
但是,如果在 bash 脚本中需要多个变量,该怎么办?假设我们要创建一个 bash 脚本,从用户那里读取 100 个不同的输入,那么需要创建 100 个变量吗?
肯定不是这样,我们需要使用数组。
在 bash 脚本中创建第一个数组
假设我们要创建一个名为 timestamp.sh 的脚本,用来更新 5 个不同文件的时间戳。
第一种使用比较原始的方法,创建 5 个不同的变量,如下所示:
#!/bin/bash
file1="f1.txt"file2="f2.txt"file3="f3.txt"file4="f4.txt"file5="f5.txt"
touch $file1touch $file2touch $file3touch $file4touch $file5
可以看到这种方法写起来比较繁琐,我们还可以使用另一种方法,创建一个包含所有文件名的数组,如下语法:
array_name=(value1 value2 value3 … )
这种比较简洁,所以我们采用数组的方法,如下:
files=("f1.txt" "f2.txt" "f3.txt" "f4.txt" "f5.txt")
访问bash中的数组元素
与大多数编程语言中一样,数组中的元素索引是从 0 开始的,所以要访问数组中第 n 个元素,其下标索引应该是 [n - 1]。
比如,要打印数组中的第 2 个元素,可以参考如下方式:
echo ${files[1]}
以下 bash 脚本 reverse.sh,将倒序打印数组中的 5 个元素:
#!/bin/bash
files=("f1.txt" "f2.txt" "f3.txt" "f4.txt" "f5.txt")
echo ${files[4]}echo ${files[3]}echo ${files[2]}echo ${files[1]}echo ${files[0]}
使用过 bash 的朋友可能会觉得奇怪,为什么我这里用这么多 echo 命令,而不是使用循环。我是想稍后在介绍 bash 中循环的使用。
也可以一次打印出所有数组元素:
echo ${files[*]}
f1.txt f2.txt f3.txt f4.txt f5.txt
可以打印数组元素的总数,也就是数组的大小:
echo ${#files[@]}
5
数组中元素的值是可以更改的。比如,我们可以用如下方式将数组中第一个元素的值改为 a.txt:
files[0]="a.txt"
向数组中添加元素
我们首先创建一个包含 Linux 版本名称的数组:
distros=("Ubuntu" "Red Hat" "Fedora")
上述数组中包含三个元素。可以使用 += 运算符将元素添加(追加)到数组的末尾,如下所示:
distros+=("Kali")
现在,数组中已经有了 4 个元素,Kali 是最后一个:
删除数组中的元素
我们首先创建一个包含 5 个数字的数组,其名称为 num:
num=(1 2 3 4 5)
可以打印一下数组中的元素:
echo ${num[*]}
1 2 3 4 5
我们可以使用 shell 内置功能 unset 来删除 数组中的第 3 个元素:
unset
现在,我们再来打印一下 num 数组中的元素:
echo ${num[*]}1 2 4 5
上面结果可以看到,第三个元素已经被删除。
也可以使用同样的方法删除数组中所有的元素:
unset
创建具有不同数据类型的混合数组
与其他编程语言不同,在 bash 中,可以创建包含不同数据类型的数组,如下 user.sh 所示:
#!/bin/bash
user=("john" 122 "sudo,developers" "bash")
echo "User Name: ${user[0]}"echo "User ID: ${user[1]}"echo "User Groups: ${user[2]}"echo "User Shell: ${user[3]}"
上述脚本中的数组包含有四个元素,其中第二个元素为整型数据类型,其余三个元素为字符串。
以上就是本次分享全部内容,欢迎讨论。
©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经