2010-08-03 6 views
1

나는 이것을 설명하겠다. 설명해 보자 ...bash 스크립트에서 문자열 변수의 이상한 행동 ... 도와주세요!

나는 3 개의 인수를받는 함수를 가진 아주 간단한 Bash 스크립트를 가지고있다. 그 인수는 모두 문자열입니다. 모든 것은 함수에 공백이있는 문자열을 전달해야 할 때까지 제대로 작동했습니다.

또한 (이름 substracFromFile) 함수를 호출하는 몇 가지 테스트 코드를 가지고 :

# try the function 

PATTERN=`echo -e '<Location test14>'` 

echo "PATTERN IS $PATTERN" 

HEADERPATTERN=`echo -e '<Location [a-zA-Z0-9]*>'` 

echo "HEADERPATTERN IS $HEADERPATTERN" 

FILE="subversion.conf" 

echo "FILE IS $FICHERO" 

substracFromFile $PATTERN $HEADERPATTERN $FILE 

이의 출력은 다음과 같습니다

인수가 전달된다
PATTERN IS <Location prueba14> 
HEADERPATTERN IS <Location [a-zA-Z0-9]*> 
FILE IS subversion.conf 
PATTERN ARGUMENT IS <Location 
HEADERPATTERN ARGUMENT IS prueba14> 
FILE ARGUMENT IS <Location 
grep: <Location: No such file or directory 
expr: syntax error 

당신이 볼 수 있듯이, 함수에 그리고 나는 그것들을 화면에 에코하여 어떻게해서든지 흰 공백으로 나뉘 었습니다 ... 함수 초기 코드를 보여 드리겠습니다 :

function substracFromFile 
{ 

     PATTERN=$1 

     HEADERPATTERN=$2 

     FILE=$3 

     # Debug only 
     echo "HEADER ARGUMENT IS $PATTERN" 

     # Debug only 
     echo "HEADERPATTERN ARGUMENT IS $HEADERPATTERN" 

     # Debug only 
     echo "FILE ARGUMENT IS $FILE" 

전달 된 문자열에 공백이 전혀없는 한이 작업은 매우 효과적이었습니다. 함수 문자열을 호출 할 때 ok로 보이지만 함수가 호출되면 왜 분할되는지 이해할 수 없습니다 ....이게 뭔가 지저분한 것이라고 확신하지만 그냥 이해가 안됩니다. . 사전에

감사합니다, 질문의 알렉스

+1

모든 변수에 큰 따옴표를 추가하십시오. – ghostdog74

답변

1

부분이 다른 부분과 일치하지 않습니다. 예를 들면 다음과 같습니다.

그러나 나는 그 질문을 게시하는 동안 만들어진 오류라고 가정합니다.

의견에 언급 된 ghostdog74은 공백이 포함 된 변수를 인용해야합니다. 특히,이 라인은 변수 따옴표가 있어야합니다

PATTERN=`echo -e '<Location test14>'` 

이 : 당신이 라인에서 변수를 설정 echo를 사용하는 이유 또한

substracFromFile "$PATTERN" "$HEADERPATTERN" "$FILE" 

을, 나는 그런이 하나 표시되지 않습니다 단순히 수 :

: 값이 가끔 특수 문자를 탈출

PATTERN='<Location test14>' 

경우, 이러한 방법 중 하나를 사용할 수 있습니다

PATTERN=$'value\nwith\tescapes' 

"값"줄 바꿈 "값"탭 "이스케이프"를 값으로 갖습니다.

또한 변수 이름에 대문자를 사용하지 않는 습관을 갖도록 권장합니다. 이렇게하면 Bash의 기본 제공 변수와 이름 충돌 가능성을 줄일 수 있습니다.

+0

안녕하세요. Dennis, 맞아요, 그저 오타입니다. 게시하는 동안 스페인어에서 영어로 스크립트를 번역했습니다 ... 죄송합니다. 여기서 문제는 함수에서 인수를 얻는 것입니다. 공백이 있으면 엉망이됩니다. 함수를 인용 인수로 호출하려고합니다. 이미 시도했는지 확실하지 않습니다. 나는 내가 어떤 진전을 이룰 경우 이 변수 이름 :에 대해 합의 알려 드리겠습니다 감사 – AlejandroVK

+0

당신은 함수가 문제를 해결 호출 할 때 인수를 인용 ... 나는 이유를 이해하는 것이 바로 싶습니다했다 this though ... 감사합니다. Alex – AlejandroVK

+0

@AlejandroVK : 인용 인수로 인해 공백 ('IFS' 변수에 포함 된 문자 - 일반적으로 공백, 탭 및 개행)에서 분리되지 않습니다. 이것은 유닉스 쉘이 아닌 모든 쉘에 공통적이다. [추가 읽기] (http://mywiki.wooledge.org/WordSplitting) 및 [여기] (http://tiswww.case.edu/php/chet/bash/bashref.html#SEC35). –