我试图在换行符上回显数组的所有元素,并在其旁边添加索引号。这样我就可以接受一些输入,然后选择一个数组元素以使用文本编辑器打开。 (它们都是配置文件)。
我目前正在这样做:
declare -a configs=(
"~/.vimrc"
... )
printf "%s\n" "${configs[@]}"
它具有每个配置路径的输出,但我不确定如何将索引号附加到每个元素的开头。
答案1
只需循环数组即可:
$ declare -A configs=( [vimrc]="~/.vimrc" [foo]="bar" [baz]="bad" )
$ for i in "${!configs[@]}"; do printf '%s: %s\n' "$i" "${configs[$i]}"; done
foo: bar
baz: bad
vimrc: ~/.vimrc
或者,如果您想使用相同的基本方法,并且数组中的值或键都没有换行符,请尝试:
#!/bin/bash
declare -A configs=( [vimrc]="~/.vimrc" [foo]="bar" [baz]="bad" )
paste \
<(printf '%s\n' "${!configs[@]}" ) \
<(printf '%s\n' "${configs[@]}" )
我假设 bash 将始终保持${!configs[@]}
和相同的顺序${configs[@]}
,但我实际上并不知道这一点,这就是为什么我个人会更舒服地显式循环数组,以便 100% 确定值是正确的。
答案2
好吧,我只是通过循环数组得到了它。但不确定是否有更好/更清洁的解决方案。
我的修复:
declare -a configs=(
"~/.vimrc"
... )
i=0
for o in "${configs[@]}"
do
printf "%d. %s\n" $((i++)) $o
done
答案3
它可能像使用nl
(数字线)一样简单:
$ configs=( first second third )
$ printf '%s\n' "${configs[@]}" | nl
1 first
2 second
3 third
假设数组的元素不包含换行符。
选择
但是,在 bash 中,从项目列表中进行选择是内置命令 select 的工作:
$ select pen in "${configs[@]}"; do echo "got it <$pen>"; [[ ${pen:+set} ]] && break; done
1) first
2) second
3) third
#? 2
got it <second>