Array Bash 스크립트의 값 인쇄

Array Bash 스크립트의 값 인쇄

내 파일에는 Threadout.txt다음과 같은 내용이 포함되어 있습니다.Thread 1/1/25/100

val1=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $1}')  
val2=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $2}')    
val3=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $3}')  
val4=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $4}')

for((i=1;i<5;i++))  
do  
  val[i]=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $[i]}')  
  echo $val[i] 
done

이 배열을 시도했지만 1 1 25 100값과 같은 올바른 결과를 제공하지 않습니다. 오류가 있나요?

답변1

코드에 몇 가지 문제가 있습니다.

  • 기억해야 할 첫 번째 중요한 점은 awk프로그램이 작은따옴표로 묶여 있기 때문에(권장됨) 쉘 매개변수 확장이 발생하지 않으며 명령문이 print $[i]작동하지 않는다는 것입니다. 이것 좀 봐StackOverflow에 대한 자세한 Q&Aawk프로그램에서 쉘 매개변수를 사용하는 방법에 대해 설명합니다 .
  • 그렇더라도 ( ) 변수 awk에 번호가 저장된 필드 는 가 아닌 으로 주소가 지정 됩니다 .awkn$n$[n]
  • val1변수를 할당 val4하지만 실제로는 사용하지 않으므로 스크립트 예제의 첫 번째 부분에서는 아무 작업도 수행하지 않습니다.
  • ${val[i]}마지막으로, 배열 변수를 역참조하려면 , not 을 선언해야 합니다 $val[i](이렇게 하면 변수의 내용 $val(빈 문자열)과 고정 문자열 이 인쇄됩니다 [i]).

awk반복적으로 호출하고 (내가 아는 한) 필드 구분 기호로만 사용될 Thread때 예제 입력의 주요 문제를 해결하지 못하는 등 일부 비효율성도 있습니다 ./

이러한 문제를 해결하려면 예제의 관련 값에 공백이 포함되어 있지 않으므로 다음을 시도해 보십시오.

#!/bin/bash

val=( $(awk '/^Thread/{n=split($2,a,/\//); for (i=1;i<=n;i++) printf("%s%s",a[i],OFS)}' Threadout.txt) )

for i in ${!val[@]}
do
    echo "${val[i]}"
done
  • 이 호출은 배열에 있는 부분 인 awk행의 두 번째 "필드"를 분할 하고 배열의 모든 항목을 (기본값은 공백)로 구분하여 인쇄합니다.Thread 1/1/25/1001/1/25/100/aOFS
  • 쉘 스크립트는 공백으로 구분된 토큰 목록이기 때문에 awk명령문을 통해 각 토큰을 배열 변수에 할당하여 이 프로그램의 출력을 가져옵니다.valval=( ... )
  • 그런 다음 배열 인덱스를 반복하고 배열 값을 인쇄합니다.

더 많은 bash 배열을 읽고 싶을 수도 있습니다.GNU Bash 참조 매뉴얼, 또는GreyCat&Lhunath의 배쉬 가이드. 저도 꼭 보시길 추천드려요주택 검사쉘 스크립트를 디버그하십시오.

관련 정보