for 루프는 여러 줄에서 작동하지 않습니다

for 루프는 여러 줄에서 작동하지 않습니다

"Apple Banana Clementine Date"와 같은 배열이 있습니다.

다음과 같이 인쇄해야 합니다.

1. Apple
2. Banana
3. Clementine
4. Date

스크립트 파일:

for i in "${fruits[@]}"; do
    echo "$lineno. $i "
    lineno+=1
done

myscript의 출력:

1.             Apple
               Banana
               Clem....

왜 lineno가 인쇄되지 않고 긴 간격 흑백으로 인쇄되는지 이해가 되지 1.않습니다 Apple.

답변1

문제는 배열입니다. 요소가 하나만 있는 배열을 만든 것 같습니다. 다음 예를 시도해 보세요.

array=("$(printf 'Apple\nBanana\nClementine\nDate')")

for ((i = 0; i < ${#array[@]}; i++)); do
  printf '%d. %s\n' $((i+1)) "${array[$i]}"
done

j=0
for e in "${array[@]}"; do
  j=$((j+1))
  printf '%d. %s\n' "$j" "$e"
done

k=0
for e in ${array[@]}; do
  k=$((k+1))
  printf '%d. %s\n' "$k" "$e"
done

그런 다음 다음을 실행하십시오.

$ ./test.sh 
1. Apple
Banana
Clementine
Date
1. Apple
Banana
Clementine
Date
1. Apple
2. Banana
3. Clementine
4. Date

실제로 하나의 요소를 포함하는 배열을 생성하는 것을 볼 수 있습니다. 세 번째 루프는 셸이 문자열에서 필드 분할을 수행하여 Apple\nBanana\nClementine\nDate4개의 개별 단어를 제공하므로 4개의 요소를 인쇄합니다.

배열을 다음과 같이 변경하는 경우:

set -f
array=( $(printf 'Apple\nBanana\nClementine\nDate') )
set +f

( 명령 출력에 set -f문자가 표시되지 않도록 와일드카드 확장을 비활성화합니다 .) 명령 출력이 공백으로 분할되는 원하는 결과를 얻을 수 있습니다.*?\[

$ ./test.sh 
1. Apple
2. Banana
3. Clementine
4. Date
1. Apple
2. Banana
3. Clementine
4. Date
1. Apple
2. Banana
3. Clementine
4. Date

모든 배열 요소를 반복 하려면 "${array[@]}"큰따옴표를 사용하거나 첫 번째 예와 같이 C 스타일 for 루프를 사용해야 합니다.

답변2

이것이 당신에게 필요한 것입니다:

[sreeraj@server ~]$ fruits=(Apple Banana Clementine Date)
[sreeraj@server ~]$ (IFS=$'\n'; echo "${fruits[*]}") | nl
     1  Apple
     2  Banana
     3  Clementine
     4  Date
[sreeraj@server ~]$

관련 정보