bash
2014-07-25 6 views 1 likes 
1

나는 그것은 사용 공간이

>./foo.sh 
"BAR" 

가 지금은 BAR BAR에 FOO 변수를 변경하려면 예상대로 작동하는 스크립트 foo.sh

CMD='export FOO="BAR"' 
$CMD 
echo $FOO 

에게 있습니다. 그래서 나는 그것이 내가 "BAR BAR"을받을 것으로 예상 실행하면 나는 스크립트

CMD='export FOO="BAR BAR"' 
$CMD 
echo $FOO 

를 얻을 수 있지만, 나는

내가 그 해결할 수있는 방법
./foo.sh: line 2: export: `BAR"': not a valid identifier 
"BAR 

를 얻을?

+0

내 배쉬 버전은'GNU bash는 버전 4.1.0 (1) -release (I386-사과 darwin13.2.0)' –

답변

2

그냥하지 마세요.

내가 그래서 당신이 명령을 넣을 경우마다

을 반복 할 필요없이 나중에 실행할 수있는 명령을 저장하기 위해 노력하고있어 Bash FAQ #50

  1. 읽기 나중에 사용하기 위해 컨테이너에 기능을 사용하십시오. 변수는 데이터를 보유하고 함수는 코드를 보유합니다.

    pingMe() { 
        ping -q -c1 "$HOSTNAME" 
    } 
    
    [...] 
    if pingMe; then .. 
    
+1

흥미있는 링크입니다하지만 질문에 대답하지 않습니다. –

+0

@LucM 문제의 근원을 해결하기 때문에 확실합니다. –

+1

"$ {CMD [@]}"솔루션을 거의 볼 수 없습니다. 사실 나는 그 자신이 대부분의 시간을 보여주고 있음을 깨닫는다. 이 "Bash FAQ"가 포즈를 취하는 시간을 다시 볼 때까지 기다릴 수는 없습니다. – konsolebox

3

당신은 (당신의 $CMD에서처럼)를 호출하여 명령으로 변수를 사용할 수 없습니다. 대신 eval을 사용하여 변수에 저장된 명령을 평가하십시오. 에만이 작업을 수행하여, 모든 쉘 논리와 진정한 평가 단계는 수행됩니다

eval "$CMD" 

(그리고이 eval에 명령을 전달하는 데 큰 따옴표를 사용합니다.)

+0

마찬가지로 주석으로 : 일반 문자열 변수 대신 명령을 저장하는 데 _arrays_를 사용하는 것이 좋습니다. 이렇게하면 명령 어를 쉽게 결합 할 수 있고 따옴표를 사용하지 않아도됩니다. – Alfe

+0

이것이 작동하는 동안,'eval'의 사용은 권장되지 않습니다 *. – chepner

+0

@chepner, 이것은 크게 여러분의 필요에 달려 있습니다. OP는 구체적인 유즈 케이스를 지정하지 않았기 때문에 오히려 그가 말한 것이 사실임을 인정하는 경향이 있습니다. 긴 명령에 짧은 것을 사용한다는 목표를 달성하는 전형적인 "더 나은"방법은 물론 쉘 기능입니다. 하지만 어쩌면 OP는 DB에서 읽기 명령을 저장하므로 문자열 만 가능합니다. 이 경우'eval'을 사용하는 것이 가장 좋은 해결책입니다. – Alfe

0

그렇게 할 수있는 적절한 방법을 사용하는 것입니다 대신 배열 :

CMD=(export FOO="BAR BAR") 
"${CMD[@]}" 
+1

OP의 평범한 문자열을 배열로 대체 할 수 있다면 9 야드 전체를 쉘 함수로 대체하는 것이 좋습니다. – Alfe

+1

@Alfe 분명히 상황을 항상 실용적으로 만드는 것은 아닙니다. 국지적 인 함수 인자들에 대한 명령. – konsolebox

관련 문제