在bash的关联数组中使用@字符作为键是否存在任何潜在的陷阱?

在bash的关联数组中使用@字符作为键是否存在任何潜在的陷阱?,bash,special-characters,associative-array,key-value,Bash,Special Characters,Associative Array,Key Value,我正在编写一个bash脚本,其中自动创建一些基本的测试输入文件 由于数据的结构方式,在我的脚本中有一部分我希望在关联数组中的一些键中使用@字符 根据粗略的回声测试,似乎没有任何问题: $ declare -A arr $ arr[1]=hello $ arr[2]=world $ arr[@1]=foo $ arr[@2]=bar $ for var in "${!arr[@]}"; do echo "key: ${var}, value: ${arr[$var]}" ; done key: @

我正在编写一个bash脚本,其中自动创建一些基本的测试输入文件

由于数据的结构方式,在我的脚本中有一部分我希望在关联数组中的一些键中使用
@
字符

根据粗略的回声测试,似乎没有任何问题:

$ declare -A arr
$ arr[1]=hello
$ arr[2]=world
$ arr[@1]=foo
$ arr[@2]=bar
$ for var in "${!arr[@]}"; do echo "key: ${var}, value: ${arr[$var]}" ; done
key: @1, value: foo
key: 1, value: hello
key: @2, value: bar
key: 2, value: world
但是由于
@
是一种安全的密钥分配,我想知道这种密钥分配是否安全,如果不安全,我可以做些什么使其更安全

在下,将
@
用作关联数组的keyname的一部分没有问题

Bash在转换为base64时,按以下顺序将at
@
和下划线
\
用作字母数字:

0..9a..za..z@

试试这个:

$ echo $((64#10))
64
$ echo $((64#_))
63
$ echo $((64#@))
62
$ echo $((64#Z))
61
$ echo $((64#A))
36
$ echo $((64#z))
35
$ echo $((64#a))
10
所以在这种情况下,这是可以的

评论
但是警告:如果您的脚本成为应用程序,对于开发语言来说可能不是一个很好的选择。

除非您像任何文字字符一样在它前面添加$字符,否则我想不会。危险与其他字符一样。@如果单独使用,它也很特别,除了在特殊模式(
@()
)中是另一个,但我认为它不适用于赋值。此外,在扩展时,您可以引用它。大多数情况下,使用格式
arr[“key”]=value
是首选的。此外,如果使用这些特殊字符遇到任何问题,您可以简单地用单引号将其括起来,以防止参数扩展。谢谢大家。我不知道引用的语法更可取;为了安全起见,我会这么做的。
$ echo $((64#10))
64
$ echo $((64#_))
63
$ echo $((64#@))
62
$ echo $((64#Z))
61
$ echo $((64#A))
36
$ echo $((64#z))
35
$ echo $((64#a))
10