为什么我无法指定包含bash数组变量长度的序列?

VxJ*_*nxV 3 bash shell

我正在编写一个脚本,通过一系列目录查看文件是否存在,找到后,将其推送到目录堆栈中pushd.这个dirs命令非常令人讨厌,我偶然发现了它的bash变量形式的内容,$DIRSTACK

$DIRSTACK是堆栈中的目录数组.它始终保证有1个条目,当前工作目录,然后推送目录.

我试图迭代目录列表,但似乎无法让for-loop接受我试图自动生成的序列长度:

for i in {1..${#DIRSTACK[*]}}; do
  echo ${DIRSTACK[$i]}
done
Run Code Online (Sandbox Code Playgroud)

执行时,bash失败并出现以下错误:

line 72: {1..2}: syntax error: operand expected (error token is "{1..2}")
Run Code Online (Sandbox Code Playgroud)

我老实说难倒,因为我已经for i in {1..5}多次手动编写脚本而没有问题,并且给出了错误消息,似乎数组项扩展的数量正如我想要的那样工作.

为什么会出现此错误?

dog*_*ane 5

如果您有一个参数,大括号扩展将无法正常工作.这是因为DIRSTACK在这种情况下,参数在扩展支架之后才会展开.

从bash手册页:

在任何其他扩展之前执行大括号扩展,并且在结果中保留对其他扩展特殊的任何字符.这是严格的文字.Bash不对扩展的上下文或大括号之间的文本应用任何语法解释.

如果您只想循环遍历数组,为什么不使用以下内容?

for i in "${DIRSTACK[@]}"
do
    echo $i
done
Run Code Online (Sandbox Code Playgroud)

或者,如果要显式使用数组的长度:

for (( i = 0 ; i < ${#DIRSTACK[@]} ; i++ ))
do
    echo ${DIRSTACK[$i]}
done
Run Code Online (Sandbox Code Playgroud)