改行文字にインデックス番号を持つエコー配列

改行文字にインデックス番号を持つエコー配列

改行文字で配列のすべての要素をエコーし​​、その横にインデックス番号を追加しようとしています。これにより、いくつかの入力を受け入れてから配列要素を選択してテキストエディタで開くことができます。 (すべて設定ファイルです)。

私は現在これをやっています:

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(numberline)を使用するのと同じくらい簡単です。

$ 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>

関連情報