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