在换行符上回显带有索引号的数组

在换行符上回显带有索引号的数组

我试图在换行符上回显数组的所有元素,并在其旁边添加索引号。这样我就可以接受一些输入,然后选择一个数组元素以使用文本编辑器打开。 (它们都是配置文件)。

我目前正在这样做:

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>

相关内容