2013-11-27 3 views
0

예 : GREP을하는유닉스 스크립트에서 배열 변수의 값을 할당하는 방법

 $cat macro 
     File abc.txt 
     File xyz.csv 
     File bdc.txt 
     File lkm.csv 
     File cde.txt 

얻을 수있는 유일한 * .txt 파일 이름

$grep -oh "\w*xml\w*" macro 
    abc.txt 
    bdc.txt 
    cde.txt 

이제 그 grep 결과를 배열에 가져와야합니다. 아래의 주어진 코드가 제대로 작동하지 않습니다. . 내가 배열로 즉 별도의 변수에 모든 단일 변수에 그렙 결과를 저장할 수 있습니다

$cat txt.sh 
     var=$(grep -oh "\w*xml\w*" macro) 
     echo ${var[0]} #echo var ---both displays same result. 

출력

abc.txt bdc.txt cde.txt 

하지만 난 값을 배열을 원하는 다음과 같이 지정됩니다.

>var[0]=abc.txt 
    >var[1]=bdc.txt 
    >var[2]=cde.txt 

참고 : xml 파일 개수는 다를 수 있습니다. 그래서 그것은 동적이어야합니다. 나는 그것에 대해서도 연구 중이다 .. 미리 감사드립니다.

+0

불행하게도 배열 일부가 제공하는 비표준 확장입니다 : 배열 읽은 후

은 당신이 원하는 무엇에 따라, $ IFS의 이전 값을 저장하고 복원하는 것이 좋습니다 수 있습니다 쉘을 사용하려면 어느 요소를 사용하는지 지정해야합니다 (적어도 첫 번째 요소의 인덱스가 1인지 0인지는 알기 위해). – loreb

답변

0

당신의 var 변수는 배열이 아닙니다. 알아두기 grep의 결과가 공백으로 구분되는 단일 변수입니다. 이는 일시적인 해결책 일 수 있습니다.

for eachval in var 
do 
echo $eachval 
#process operations 
done 

루프의 각 반복 그냥 IFS 설정 쉘 스크립트의 시작 부분에서 루프

0

에 초기화, 당신은 배열 변수를 하시겠습니까있는 variable.If에서 항목을 제공합니다 쉘 변수 '\ n을'에 의한 필드를 분리해서 n을 \하는

IFS=$'\n' 
$cat txt.sh 
var=$(grep -oh "\w*xml\w*" macro) 
echo ${var[0]} #echo var ---both displays same result. 

Explanantion : : $ IFS가 개행 문자 만 (\ 않음)로 설정하는 것이 보장 떠들썩한 파티의 입력 필드 분리하다하여 출력 라인 whitespac에서 분할되지 않습니다. e를 사용하여 각 행을 별도의 배열 요소로 저장할 수 있습니다. 이것이 없으면 명령 출력의 각 단어가 다른 요소가됩니다.

oldifs="$IFS" 
IFS=$'\n' 
array=($(echo -e "foo bar\nbaz bar")) 
IFS="$oldifs" 
관련 문제