2012-11-15 2 views
4

가능한 중복 :
Printf example in bash does not create a newlinebash 배열이 개행을 무시하는 이유는 무엇입니까?

내가 샘플 스크립트 하나 개의 배열로 세 가지 기능을 집계하는 "array-test.sh"이 : 그러나

[[email protected] ~]$ cat array-test.sh 
#!/usr/bin/env bash 

function1() { 
    printf '%s\n\n\n' "cat" 
} 

function2() { 
    printf '%s\n\n\n' "dog" 
} 

function3() { 
    printf '%s\n\n\n' "mouse" 
} 

for function in\ 
    function1\ 
    function2\ 
    function3; do 
    array[$((index++))]=$($function) 
done 

echo "${array[@]}" 
[[email protected] ~]$ ./array-test.sh 
cat dog mouse 
[[email protected] ~]$ 

을, 줄 바꿈 문자가 없습니다. 어떤 행동을합니까?

+1

나는'$()'이 역 인용 연산자처럼 행동한다고 ​​믿는다. –

+0

왜이 복잡한 코드를 게시 했습니까? 'echo "$ (function1)"' –

+0

@ KarolyHorvath로 문제를 재현 할 수 있습니다. 문제의 핵심은 대개 가장 어려운 문제이기 때문입니다. 사실 당신이 그것을 즉각적으로 보았다는 사실은 당신이 OP보다 bash의 quirks에 더 익숙하다는 것을 증명합니다. 의심스러운 의견 이라기보다는 답을 주면서 왜 우월감을 과시합니까? –

답변

1

ÁlvaroG.Vicario에 표시된대로 백틱 (및 $())은 후미 줄 바꿈을 제거합니다.

#!/usr/bin/env bash  

function1() { 
    printf '%s' "cat" 
} 

function2() { 
    printf '%s' "dog" 
} 

function3() { 
    printf '%s' "mouse" 
} 

for function in\ 
    function1\ 
    function2\ 
    function3; do 
    array[$((index++))]=$($function) 
done 

# manually add three newlines here 
array=("${array[@]/%/$'\n'$'\n'$'\n'}") 

echo "${array[@]}" 
+0

답장을 보내 주셔서 감사합니다. 이 기술이 어떻게 불려지는지 설명해 주시겠습니까? "$ {array [@]/%/$ '\ n'$ '\ n'$ '\ n'}"'? 배열에 대해이 매개 변수 확장이 있습니까? – Martin

+0

@Martin -'$ '\ n "'=> 0x0a 문자; ' '\ n''=> \ n 문자들. 이스케이프 시퀀스를 리터럴 문자열로 보간하는 방법입니다. – amphetamachine

+0

"패턴 대체"여야합니다. 사용법은'$ {parameter/pattern/string}'입니다. 이 "%"이면 이 끝에 오도록 수정합니까? – Martin

2

또 다른 옵션을 : : 문자열의 끝에 문자 (@ 여기)를 추가, 당신이 해결해야 할 것이다 당신이해야합니다 그래서 만약 어떤이 그것을 탈출 없다. 문자열의 중간에있는 개행 문자는 $(...)에 보관됩니다. 그런 다음 매개 변수 확장으로 문자를 제거하십시오.

#!/bin/bash 
function1() { 
    printf '%s\n\n\[email protected]' "cat" 
} 

function2() { 
    printf '%s\n\n\[email protected]' "dog" 
} 

function3() { 
    printf '%s\n\n\[email protected]' "mouse" 
} 

for function in\ 
    function1\ 
    function2\ 
    function3; do 
    array[index++]=$($function) 
    array[index]=${array[index]%@} 
done 

echo "${array[@]}" 
1

서브 쉘 확장은 줄 바꿈 문자를 자르지 만 끝 부분에서만 발생합니다. 여기에 kludge가있다.

function3() { 
    printf '%s\n\n\n-' "mouse" 
} 

foo=$(function3) 
foo=${foo%-} 
echo "$foo" 
+0

이것은 영리합니다 :) 그러나 어떤 이유로 "개"와 "마우스"는 여전히 앞에 공백 문자가 있습니다. – Martin

+0

각 함수 내에서 출력 문자열의 끝에''- '' 문자를 추가해야합니다. 그러나'$ {foo % HERE} '에있는 한 어떤 문자도 될 수 있습니다. – amphetamachine

관련 문제