2015-01-23 3 views
0

변수를 확장 할 수 있어야합니다. 선언 문자열에 다른 변수를 확장 할 때처럼 일반적으로 선언 변수를 확장하는 것이 아니라 선언 문자열을 확장 할 수 있어야합니다. 보다는 ... "this variable contains a $variable" :bash 변수는 포함하지만 변수는 포함하지 않습니다.

variable=word 
var="this variable contains a $variable" 

echo ???? 

나는 결과 명령을 필요로 다른 모든 상황에서 일반적으로 확장해야하기 때문에 "this variable contains a word"

변수 선언은 동일하게 유지해야합니다. 그래서 나는 선언문에 작은 따옴표를 사용할 수 없다.

+0

작은 따옴표 만 사용 하시겠습니까? 아니면 변수가 이미 큰 따옴표로 묶여있는 스크립트가 있습니까? –

+0

@RayToal 불행히도 아니오, 변수 선언을 변경할 수 없습니다. 이것을 반영하도록 질문을 업데이트했습니다. – Chrono

+0

이것은 불가능합니다. 'var = "blah blah $ variable"을 실행하면'$ variable'은'var'에 할당되기 전에 확장됩니다. (이것을 쉽게 볼 수 있으며,'variable'의 값을 변경해도'var'에 영향을주지 않습니다.). – rici

답변

3

.
인쇄 할 때 확장이 오래되었습니다 (set을 사용하여 볼 수 있음). 이 $variable 현재 리터럴 문자열이 어떨지의 모든 발생을 대체 할

echo ${var/"$variable"/'$variable'} 

: 모든에서 정의 을 변경할 수없는 경우

, 당신은 을 시도 할 수있는 유일한 것은 대체를 되돌릴 수있다 $variable이므로 예제에서 해당 방법이 정의되었는지 여부에 관계없이 word의 모든 항목을 $variable으로 바꿉니다.
Jasper가 올바르게 지적했듯이 이것은 이 정의와 인쇄 사이에서 변경되지 않는다는 사실에 달려 있습니다. $var. 인쇄 할 때 정의에

  1. 를 사용하여 작은 따옴표 및 eval : 당신이 실제로 정의를 변경할 수 있지만 확장이 계속 발생 할 경우

    지금,하는 옵션들이 있습니다 . 물론, 이것은 다소 번거 롭다.
    변수 확장은 정의시보다 인쇄시에 발생합니다 (실제로는 언제든지 eval 실행).

  2. 두 개의 다른 변수를 사용하십시오.

    매번 eval "echo "'"'"$var"'"'을 쓰는 대신, 그 결과를 변수에 저장하고 바로 사용할 수 있습니다. 맞습니까?

    var='this variable contains a $variable' 
    varX="$(eval "echo "'"'"$var"'"')" 
    # later 
    echo $varX  # -> this variable contains a word 
    echo $var  # -> this variable contains a $variable 
    

    또는은 물론 단지 $var의 정의를 복사 "에 의해 '을 대체 ...하지만 지루입니다. : P

    여기서 확장은 $varX을 정의 할 때 발생합니다.

  3. 두 개의 다른 변수 대신 배열을 사용하십시오.

    배열에 대한 $var${var[0]} 동일하기 때문에 이것은 아마 당신이 원하는에 도달만큼 가까운

    tmp='this variable contains a $variable' 
    var=("$(eval "echo "'"'"$tmp"'"')" "$tmp") 
    # later 
    echo $var   # -> this variable contains a word 
    echo ${var[1]}  # -> this variable contains a $variable 
    

    할 수 있지만 여전히를 변경해야합니다, 그래서 이것은, 정말 재미있다 정의.

+0

업데이트 된이 솔루션을 규칙에 질문, 변수 선언을 변경할 수 없습니다. – Chrono

+0

내 대답이 업데이트되었습니다. – Siguza

+0

나는이 질문에서 내가 찾고있는 것이 불가능하다는 것을 알았다. 이전에 제안 된 것처럼 작은 따옴표를 사용하는 다른 솔루션을 찾아야 할 것입니다. 그러나이 질문에 대해 상대적으로 관련이 없으므로이 답변을 수락 할 것입니다. – Chrono

3

당신이 따옴표를 사용할 수 있습니다

따옴표 안에 $variable가 정의
시 해당 변수 의 내용으로 치환되기 때문에 당신은 무엇을 요구하는지 것은, 효과적으로 불가능
variable=word 
var='this variable contains a $variable' 
echo var 
+0

이 솔루션을 지배하기 위해 질문을 업데이트했습니다. 변수 선언을 변경할 수 없습니다. – Chrono

+0

변수 선언을 변경할 수 없으면 문제를 잊어 버리십시오. $ 변수는 변수 선언으로 대체됩니다. ** bash (1) ** 변수 치환은 var = "이 변수는 큰 따옴표로 묶여 있기 때문에 $ 변수를 포함합니다"에서 수행됩니다. –