我正在编写一个脚本,通过一系列目录查看文件是否存在,找到后,将其推送到目录堆栈中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}
多次手动编写脚本而没有问题,并且给出了错误消息,似乎数组项扩展的数量正如我想要的那样工作.
为什么会出现此错误?
如果您有一个参数,大括号扩展将无法正常工作.这是因为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)