2017-09-07 13 views
1

스크립트를 구현하는 동안 다음과 같은 문제가 발생합니다. 명령의 다중 행 결과를 변수에 넣을 때 내 다중 행 문자열의 마지막 (빈) 행이 사라지는 것 같습니다., 변수에 저장할 때 왜 내 멀티 라인 문자열의 마지막 (비어있는) 줄이 사라지나요?

이 줄은 "비어 있습니다". 그러나 DB에 저장된 코드 블록을 연결하고 "\ n"문자를 사람이 읽을 수있는 문자열에 포함하기 때문에 포함 된 캐리지 리턴을 잃을 수 없습니다 ...

test="A 

B 
"; 
test2=`echo "$test"`; 
echo "||$test2||"; 

||A 

B|| 

를 반환 : 나는 "\ n을"의 일부를 분실 한 경우, 나는 내 문제를 설명하기 위해 코드를 내 코드 들여 쓰기의 일부) 여기

입니다 잃게됩니다 w ...> 마지막 (빈) 라인 사라지고 캐리지 리턴 따라서 내 사람이 읽을 수있는 코드에서 누락 된 -

||A 

B 
|| 

는 : 하일 나는 기다리고 있었다. 내 여러 줄 문자열의 마지막 줄이 비어있을 때

이 문제는 ... 발생

이 마지막 줄이 사라 왜

  • 을 알고 계십니까?
  • 마지막으로 빈 줄이 여러 줄 문자열 변수에 저장되도록하려면 어떻게해야합니까? 전체 프로세스가 아니라이기 때문에 나는 물론 가장 쉬운 솔루션을

    test2="$test"; 
    

    을 사용할 수 없습니다

참고 :

test="^A\n\nB\n^" 
test2="`echo "$test" | sed -e 's/\^//g'`"; 

그러나 나는이 문제를 내가 할 수있는 최대한 단순화하기 위해 노력했다. 대신 변수에 echo의 출력을 할당에서 발생하는 문제를 해결하기 위해 노력

+0

명령 치환 항상 개행 문자를 후행 트림 - - 디자인과 사양에 맞습니다. 그렇지 않으면,'foo = $ (echo foo)'는 문자열'foo'를 포함하지 않을 것이지만, 줄 바꿈 줄을 가질 것입니다 - 그것은 사람들을 혼란스럽게합니다. –

+0

BTW, ksh의 특정 버전은 무엇입니까?서로 다른 호환되지 않는 구현이 많이 있습니다. –

+0

@CharlesDuffy 사용중인 ksh 버전을 찾으려고 시도한 명령이 없습니다 ... "ksh --version", "echo $ {. sh.version}"& "echo $ KSH_VERSION"을 시도했습니다. 내 ksh 버전을 식별 할 수있는 다른 가능성을 알고 있다면 매우 흥미 롭습니다 .-) – Seba991

답변

2

명령 치환 항상 개행 문자를 후행 트림 모든 ^ 문자를 제거 - 그에 따라입니다 디자인 및 사양. 당신이 원하지 않는 경우에, 당신은 당신의 출력에 고정시길 문자를 추가하고 트림 할 수 있습니다, 당신은 보존 할 줄 바꿈이 전에시길이되도록 :

test="A 

B 
" 
test_wip=$(printf '%sEND' "$test") 
test2=${test_wip%END} 
+0

사실, 결과를 얻을 수 있습니다. test_wip = $ (printf '% sENDOFLINE' "$ test"); test_wip2 = "'echo"$ test_wip "| sed -e '/ \^// g"; "; test2 = $ {test_wip2 % ENDOFLINE}; 아무도 내가 해석하려고하는 코드에서 "ENDOFLINE"을 사용하지 않기를 바랍니다. – Seba991

+0

@ Seba991 :'test2 = "$ (echo"$ {test} "ENDOFLINE | sed -e 's/\^// g')"';로 비트를 줄일 수 있습니다. 'Test2 = "$ {test2 % ENDOFLINE}"' – markp

+0

@ Seba991, 글쎄, 우리는 단 하나의'ENDOFLINE' (끝 부분에있는 하나) 만 제거하고 있으므로, 리터럴 데이터. –

0

예를 들어,이 경우 문자열 처리에 내장 ksh 's의 사용을 고려 (예를 들어, \ n을의 후행의 제거) :

$ test="^A\n\nB\n^" 
$ test2="${test//^}" 
$ echo "||${test2}||" 
||A 

B 
|| 
  • //^ :
+0

내가 이것을 할 때, 내가 얻을 오류 : KSH : TEST2 = "$ {테스트// ^} ": 0403-011 지정한 대체가이 명령에 유효하지 않습니다. – Seba991

+0

hmmmm,'ksh --version'은 무엇을 반환합니까? – markp

+0

@ Seba991에서 명령 대체는 ksh 93u +에서 유효합니다. 이전 버전 (또는 호환되지 않는 제 3 자 클론 (예 : mksh))을 사용하는 경우 질문에 해당 버전을 지정해야합니다. –