我编写了一个简单的脚本,它匹配以破折号开头的位置参数,并将它们保存到一个关联数组中.

declare -A opts

for i; do
  [[ "$i" =~ - ]] && opts[$i]=1
done

shift "${#opts[*]}"

echo "opts: ${opts[*]}"
echo "!opts: ${!opts[-d]}"
echo "Query: $*"

对于调用./script -d hello world,输出为:

opts: 1
!opts: hello
Query: hello world

这是意想不到的,因为如果定义了${!opts[-d]}的关键字,它本身就应该是-d.此行为是由Shift命令引起的,当从代码中删除该命令时,输出将如预期:

opts: 1
!opts: -d
Query: -d hello world

为什么Shift键会干扰创建的关联数组?

推荐答案

关联数组没有更改;您可以通过在shift后面加一个declare -p opts来验证这一点,这将给出

declare -A opts=([-d]="1" )

问题是:${!opts[-d]}并不像你所期望的那样.首先,查找opts[-d],这是值1.然后!意味着它被用作要替换的变量的name--所以它实际上等同于1,在shift之后,它是hello.

如果要打印出关联数组的所有键,请使用${!opts[@]}.前导!bash参数展开中有两种不同的含义,具体取决于是与括号中包含@*的数组一起使用,还是与索引/正常变量一起使用.

Linux相关问答推荐

PERF显示不应该执行指令的内核的用户空间周期

从一个文件中读取文件名并将文件名和内容存储到另一个带有|的文件中作为分隔符

2023 年如何在现代 Linux 上安装 Firebird SQL 版本 3 或 4?

构建 python 映像时 Docker compose 问题,访问被拒绝或存储库不存在

为什么要命令; ls -l file_doesnot_exists > /dev/null 2>&1 正在工作; ls -l 2>&1 file_doesnot_exists > /dev/null 不是

在三星 chromebook 上编程

Linux time 命令输出中 real、user 和 sys 的含义

/usr/local/bin/ 中Collection的权限被拒绝

如何将执行的shell命令的结果存储在python的变量中?

diff 命令仅获取不同行的数量

pthread_exit 与返回

在亚马逊 ec2 linux 微型实例上的 virtualenv 中安装 scipy 时遇到问题

我可以在 Ubuntu 上使用 Homebrew 吗?

使用 cmake 构建错误:找不到 -lpthreads

如何从任意 pthread_t 获取线程 ID?

在 Linux 上的进程之间传递消息的最快技术?

命令列出除 . (点)和..(点点)

Supervisord - 将进程标准输出重定向到控制台

是否有git sed或类似功能?

使用 WGET 运行 cronjob PHP