2012-09-25 2 views
0

IFS와 변수를 사용하여 변수를 "읽는"방법은 무엇입니까?변수에서 변수 읽어 오기

파이프로 짝을 지어 일부 데이터를 분할하여 작업하려고합니다. 나는 점점 오전 오류가 난 그냥이 어려운 방법을 수행 read: 'site|database': not a valid identifier

SITES="abc|abc xyz|asdf" 
for site in $SITES; 
do 
    IFS="|" read domain database <<< echo $site; # es no bueno mi amigo 
    echo "Site: $domain \t\t\t Database: $database"; 
done; 

암이다? 나는 본래 바셔가 아니다. ;)

+0

모든 세미콜론은 쓸모가 여기에

는 고정 된 스크립트입니다. 쉘 문법은 C :-)가 아닙니다. – Jens

+0

다른 언어에서 왔습니다. 미안합니다. – Spechal

답변

1

스크립트에 문제가있는 경우 Here Stringread에 올바르게 전달하지 않아야합니다. 다음과 같이 수행해야합니다 :

IFS=$"|" read domain database <<< "$site" # es no bueno mi amigo 

뿐만 아니라 변수를 인용해야합니다.

스크립트가 작동합니다.

SITES="abc|abc xyz|asdf" 
for site in $SITES 
do 
    IFS="|" read domain database <<< "$site" # es no bueno mi amigo 
    echo -e "Site: $domain \t\t\t Database: $database" 
done 

그것은 인쇄 :이 조각의

Site: abc      Database: abc 
Site: xyz      Database: asdf 
+0

고맙습니다.이 기능을 사용하기 위해서는 $가 필요한 이유는 무엇입니까? 여기에 문자열을 인용하시오. – Spechal

+1

Here Strings에 대한 Bash 스크립팅 가이드를보십시오. http://tldp.org/LDP/abs/html/x17700.html 특수 문자를 보존하기 위해 모든 변수를 인용하는 것이 좋습니다. . – dogbane

0

나는 그것을 작성하는 단순한 생각 :

SITES="abc|abc xyz|asdf" 
for site in $SITES 
do 
    domain=${site%|*}  # removes everything from '|' onward 
    database=${site#*|} # removes everything up through '|' 
    echo "Site: $domain \t\t\t Database: $database" 
done 

${parameter%word}${parameter#word} 표기법에 대한 자세한 내용은 §3.5.3 Shell Parameter Expansion in the Bash Reference Manual를 참조하십시오.

read a b <<<$variable 

read a b < <(command) 

내가 ($IFS 덤비는없이)이 시도 것 :

read domain database <<<${site/|/ } 
+0

이것에 대해 생각해 주셔서 감사합니다. 내가 당신이 제공 한 링크를 읽을 것입니다. – Spechal

1

는 두 구문을 혼합하고 , 텍스트는 여전히 라인 단위로 읽혀집니다. 그러나 (레코드가 개행 문자를 포함 전혀 없다고 가정)을 수행 할 수 있습니다 :

SITES="abc|abc xyz|asdf" 
echo "$SITES" | tr \| '\012' | while read domain database; do 
    echo "Site: $domain \t\t\t Database: $database"; 
done 

은, 첫 문장을 명확히의 동작을 고려하기 위해 다음

echo "$SITES" | while read a b c; do echo "a=$a, b=$b"; done 

echo "$SITES" | while IFS=\| read a b c; do echo "a=$a, b=$b"; done 
+0

$ {site/| /}의 "/ | /"부분이하는 일을 설명하는 문서 나 다른 것을 알려주십시오. – Spechal

+1

http://tldp.org/LDP/abs/html/string-manipulation.html - bash 문자열 조작. 이 특정 것은 "Substring Replacement"에 있으며, (첫 번째 만)'| '를 공백으로 대체합니다. – Mat

+0

불행히도 나는 하나의 대답만을 받아 들일 수 있지만, 당신에게 좋은 대안을 제시하고 감사하게 생각합니다. – Spechal

0

IFS 단어 분할에 영향을 미칠 것입니다

+0

당신의 의견을 보내 주셔서 감사합니다. – Spechal

관련 문제