2010-06-07 5 views
4

다음 svn 명령을 자동화하고 싶습니다. 이 명령은 내 시스템에서 원하는 결과를 만들어 주 - 명령 줄에서 발행 우분투 10.04, SVN 1.6.6, bash 쉘을, :변수 및 줄 바꿈에 대한 도움말 및 bash 스크립트에서 인용하기

svn ci -m $'Added new File: newFile.txt\nOrig loc: /etc/networking/newFile.txt' /home/user/svnDir/newFile.txt 

나는 가정, 떠들썩한 파티 스크립트에서 해당 명령을 실행하고 싶습니다 파일의 원래 전체 경로는 $ oFileFull 변수에 포함되어 있으며 파일 이름은 $ oFileName에 있습니다. 스크립트는 svn 디렉토리에서 실행됩니다. 파일 이름 및/또는 경로에 공백이 포함될 가능성을 허용해야합니다.

은 나의의 shel 스크립트 내부의 라인과 같습니다

svn ci -m$'Added new file: ${oFileName}\nOrig loc: ${oFileFull}' ${oFileName} 

하지만 명령이 실행되기 전에 변수 (공백을 포함 할 수 있음) 확장하고자, 나는 동안이 작업을 수행하는 방법을 알아낼 수 없습니다 Subversion 주석 로그에 새 줄을 얻기 위해 필요한 작은 따옴표로 svn 주석을 묶습니다. 나는이 명령을 올바르게 인용하고 조립하는 방법을 알아 내려고 노력하고있다. 어떤 도움을 주셔서 감사합니다.

답변

4

변수에 개행을 넣고 개행이 필요할 때마다 변수를 사용하고 큰 문자열 주위의 따옴표를 큰 따옴표로 변경하십시오. 또한 파일 이름이 들어있는 변수를 항상 인용해야합니다.

nl=$'\n' 
svn ci -m"Added new file: ${oFileName}${nl}Orig loc: ${oFileFull}" "${oFileName}" 
+0

감사합니다. 매력처럼 작동했습니다. 흥미롭게도, 출력을 표시하기 위해 echo를 실험하고 사용할 때 $ nl 변수는 작은 따옴표 대신 큰 따옴표로 선언해야했습니다. 작은 따옴표는 svn 명령에 대해 작동하며 로그의 형식이 올바르게 지정됩니다. – Scott

+0

@Scott :'nl = $ '\ n'; echo "one $ {nl} two"가 효과적입니다. 'nl = $ "\ n"'을 사용하는 것은이 문맥에서'nl = "\ n"과 동일하며 리터럴 "\ n"(백 슬래시 -n)의 해석에'echo -e '가 필요합니다. 당신의 버전'echo'가 항상'-e'를하지 않는 한. \ n ""echo를 "echo -e"a \ nb "와 비교하면 무엇입니까? –

+0

echo "a \ nb"= a \ nb echo -e "a \ nb"= a 다음 행에 b 다음에 – Scott

0

@Dennis :

와우,이 사람이 명확하고 간결하게이 문제를 설명하는 온라인 자원으로 날 지점 수 있다면 나는 그것을 싶지만, 주위에 내 머리를 정리하기 어렵다. 내가 찾은 것들은 나를 위해 그것을 정리하지 않았다. 혼란의

내 최신의 소스는 다음과 같다 :

#!/bin/bash 
nl=$'\n' 
msg="Line 1${nl}Line 2" 
echo $msg  # ouput = Line 1 Line 2 
echo -e $msg  # ouput = Line 1 Line 2 
echo "$msg"  # output = Line 1 
       # Line 2 

내가 설명을 시도하고있어 변수 $ MSG 주위에 따옴표를 가진 것은 큰 따옴표없이, 두 개의 라인으로 출력을 분할한다는 것입니다, -e 스위치를 사용하더라도 새로운 행은 없습니다.

큰 따옴표가 필요한 이유가 없습니다. msg 변수의 일부로 할당 된 $ nl 변수가 확장되지 않는 이유는 무엇입니까?

나는 내 자신의 질문에 답하여 StackOverflow faux pas를 ​​저 지르지 않기를 바랍니다. 그리고 실제로, 나는 정말로 대답을 제공하지 않고 단지 당신의 의견에 대한 응답입니다. 필자는 필요에 따라 설명을 형식화 할 수 없습니다.

+0

$ nl 변수는 $ msg에 할당되면 * 확장됩니다. 그러나 왜 내 반향이 당신의 예에서 무엇을하는지에 대한 다른 긴 답변을보십시오. (아마 내 자신의 가짜를 저지르고,하지만 난 코멘트에 여기에 완전한 대답을 넣을 수 없습니다.) –

7

@Scott, 나는 이것이 이미 답변되었지만 echo $ msg와 echo "$ msg"의 차이점에 대한 추가 질문에 대한 의견이 있습니다. 귀하의 예 :

nl=$'\n' 
msg="Line 1${nl}Line 2" 
echo $msg  # ouput = Line 1 Line 2 
echo -e $msg  # ouput = Line 1 Line 2 
echo "$msg"  # output = Line 1 
       # Line 2 

각 경우에 쉘이 echo 명령에 전달하는 인수의 수를 확인하는 것이 좋습니다. Echo는 여러 가지 인수를 취합니다. 모든 것을 표준 출력에 순서대로 쓰고, 마지막 하나를 제외하고 각각 하나씩 공백을 둡니다.

echo $ msg에서 쉘은 $ msg를 사용자가 설정 한 문자 (그 중 하나는 개행 문자)로 바꿉니다. 그런 다음 을 호출하기 전에 반향을 호출하면 내부 필드 분리 기호 (IFS)를 사용하여 해당 문자열을 여러 인수로 분할하고 결과 인수 목록을 반향에 전달합니다.기본적으로 IFS는 공백 (공백, 탭 및 줄 바꿈)으로 설정되므로 쉘은 $ msg 문자열을 "Line", "1", "Line"및 "2"네 개의 인수로 잘라냅니다. Echo는 쉘이 개행 문자를 공백 문자처럼 간주하기 때문에 개행 문자를 보지 못합니다.

echo -e $ msg의 경우 echo 명령은 "-e", "Line", "1", "Line", "2"의 5 개의 인수를받습니다. -e 인수는 명령이 인수에서 보는 모든 백 슬래시 문자를 확장하도록 지시하지만 아무 것도 없으므로 echo는 인수를 변경하지 않고 그대로 둡니다. 결과는 첫 번째 예와 같습니다. 마지막 예에서

, 그래서 하나 개의 인수를 수신 에코, $msg을 확장하여 하나 개의 인수로 큰 따옴표 사이에있는 모든 치료를 위해 하지만 반향 그 내용을 전달하는 "$의 MSG", 쉘을 이야기하고 에코 , 문자, 숫자, 공백 및 개행 문자가 포함 된 문자열입니다. 이 문자열은받은 문자열과 정확히 일치하므로 "줄 1"과 "줄 2"가 별도의 줄에 나타납니다.

이 실험을 시도해보십시오 편지 나 같은 임의 뭔가에 IFS를 설정하고, 쉘이 다르게 문자열을 분할하는 방법을 볼 수 : 공백에 대한, 특히 마법은 어디에도

nl=$'\n' 
msg="Line 1${nl}Line 2" 
IFS=i 
echo $msg  # ouput = L ne 1 
       # L ne 2 

없습니다. 여기서 이상한 IFS 때문에 쉘은 문자 i를 구분자로 취급하지만 공백이나 개행 문자는 취급하지 않습니다. 따라서 echo는 "L", "ne \ nL"및 "ne 2"의 세 가지 인수를받습니다. (개행 문자를 \ n으로 표시하고 있지만 X 또는 p 또는 5와 같은 문자 일뿐입니다.)

셸의 명령 줄에 큰 따옴표가 있으면 명령에 대한 인수가 있으면 논리가 이해되기 시작합니다.

+0

감사합니다 - 매우 도움이됩니다. – Scott

0

배쉬는 인접한 따옴표 붙은 섹션을 연결합니다. 그냥 떠들썩한 파티의 길고 상세한 매뉴얼을 읽는 것보다 더 좋은하지 않을 수 있지만 그래서 온라인 가이드 예를

$ r=rooty 
$ t=tooty 
$ echo $r$'\n'$t 
rooty 
tooty 
$ echo "$r $r"$'\n'$t 
rooty rooty 
tooty 

를 들어, 고급 Bash 스크립팅 가이드는 유용 할 수 있습니다. vim의 Man 명령 (이전 버전이 아니라면 버전 7.2에서 표준)을 사용하여 bash 매뉴얼을 가져온 다음 들여 쓰기 기반 접기를 사용하여 계층 구조를 찾아 볼 것을 권장합니다. 글쎄, 처음부터 끝까지 3300 줄을 모두 읽을 시간과 인내가 없다고 가정하십시오.

관련 문제