개행 문자에 인덱스 번호가 있는 에코 배열

개행 문자에 인덱스 번호가 있는 에코 배열

줄 바꿈 문자로 배열의 모든 요소를 ​​에코하고 그 옆에 인덱스 번호를 추가하려고 합니다. 이렇게 하면 일부 입력을 받아들인 다음 배열 요소를 선택하여 텍스트 편집기로 열 수 있습니다. (모두 구성 파일입니다).

나는 현재 이 일을 하고 있습니다:

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>

관련 정보