bash 关联数组
如果您曾经编写过代码,无论是Shell脚本,Python脚本,C ++还是什至是Scratch,那么您都知道变量至关重要。 计算机和编码器将变量用作路站,它们在其中秘密地来回传递信息。 例如,如果您需要在Shell脚本中处理用户名,则可以设置一个变量,将用户名放入变量中,然后指示计算机对变量进行处理(对照授权用户列表进行检查) , 例如)。 变量很重要,因为它们使代码能够动态变化:它们是信息的占位符,这些信息预计将在每次运行代码时更改。
但是,由于变量非常普遍,因此它们也变得很笨拙。 通常,您在一个代码项目中收集了如此多的变量,以至于几乎无法跟踪所有变量。 您可以使用巧妙的约定,例如在所有相关变量的前面加上一个通用字符串(user_name,user_pass,user_time等),也可以在某个地方创建它们的主列表以方便参考,但是跟踪它的开销所有人都会变得很累。
传统上,此问题的一个答案是数组。 这些代码在大多数编码语言(包括Bash这样的shell脚本语言)中都运行良好。
大多数Shell提供创建,操作和查询索引数组的功能。 用简单的英语来说,索引数组是带有数字前缀的事物的列表。 事物列表及其分配的编号方便地包装在单个变量中,这使在代码中轻松“携带”成为可能。
但是, Bash具有创建关联数组的功能,并且将这些数组与其他任何数组一样对待。 关联数组使您可以创建键和值对的列表,而不仅仅是编号的值。
您可以将值分配给任意键:
$
declare
-A userdata
$ userdata
[ name
] =seth
$ userdata
[ pass
] =8eab07eb620533b083f241ec4e6b9724
$ userdata
[
login
] =
`
date
--utc +
% s
`
查询任何键:
$
echo
" ${userdata[name]} "
seth
$
echo
" ${userdata[login]} "
1583362192
您期望从阵列执行的大多数常规阵列操作均可用。 例如,您可以列出所有值:
$
echo
" ${userdata[*]} "
8eab07eb620533b083f241ec4e6b9724 seth
1583362192
您可以查看整个数组:
$
typeset
-A
declare
-A
BASH_ALIASES =
'()'
declare
-A
BASH_CMDS =
'()'
declare
-A
userdata =
'([pass]="8eab07eb620533b083f241ec4e6b9724"
[name]="seth"
[login]="1583362192" )'
您还可以使用unset命令从阵列中删除项目:
$
unset userdata
[ pass
]
$
typeset
-A
[ ...
]
declare
-A
userdata =
'([name]="seth"
[login]="1583362192" )'
最后,您可以关闭整个阵列。
$ unset "userdata[*]"
数据数组
utmp ,将登录时间与该时间所引用的用户相关联 ,而不是仅将两个数据对象存储为没有明显联系的单独变量,这对您将更为有用。此外,与变量不同,数组中的条目在将数据存储到其中之前不需要存在。 在存储数据之前,您不必确切地知道要存储多少数据。 如果您正在处理无法控制或预测的数据,那么这可能是一个很大的优势:如果您不知道在utmp中一天到第二天期望有多少用户,那么很难构建一个包含所有内容的脚本。条目。 但是,对于数组,您要做的就是声明一个数组并读取数据,创建一个新的键和值对,直到用完要提取的数据。
数组功能强大,在Bash以外的编程语言中很常见。 立即开始使用它们!
翻译自: https://opensource.com/article/20/6/associative-arrays-bash
bash 关联数组