"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\nDate
4개의 개별 단어를 제공하므로 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 ~]$