2014-07-22 3 views
1

URI를 따르기 위해 변수와 텍스트를 포함하는 문자열을 전달해야하는 스크립트가 있습니다.Bash에서 변수의 변수를 확장하십시오.

이의 예는 다음과 같습니다

URI="${PROTO}://${USER}:${PASS}@${HOST}/${TARGET}"

내가 변수 $URI를 정의하지만 배쉬 스크립트가가는 경우가있을 것입니다 때 ${PROTO}${USER}${PASS}, ${HOST}${TARGET}가 정의되지 않은 변수를 실행되도록 URI의 마지막 형태로 문자열을 확장해야합니다.

어떻게하면됩니까? 나는 eval: When You Need Another Chance을 읽었지 만, URI 문자열의 많은 부분을 벗어나는 것은 위험 할 수 있으므로 eval을 사용하는 아이디어를 좋아하지 않습니다.

다른 방법이 있습니까? 이 문제에 대해 권장되는 솔루션은 무엇입니까?

감사 M

답변

3

가변 데이터를 저장 ; PROTO 그 외의 값이없는 경우 아직 데이터가 없습니다. 템플릿이 필요합니다. 당신이 데이터의 나머지 부분을 할

uri_template="%s://%s:%[email protected]%s/%s" 

나중에, 당신은 템플릿으로 그들을 연결할 수 있습니다.

uri=$(printf "$uri_template" "$PROTO" "$USER" "$PASS" "$HOST" "$TARGET") 

은 (bash에서는 -v 옵션을 사용하여 명령 치환에서 포크를 방지 할 수 있습니다. printf -v uri "$uri_template" "$PROTO" "$USER" "$PASS" "$HOST" "$TARGET"를)

는 또한 함수 정의 할 수 있습니다 다음을 실행하기 전에

uri() { 
    # I'm being lazy and assuming uri will be called with the correct 5 arguments 
    printf "%s://%s:%[email protected]%s/%s" "[email protected]" 
} 

# Variables and functions exist in separate namespaces, so the following works 
uri=$(uri "$PROMPT" "$USER" "$PASS" "$HOST" "$TARGET") 
+0

나는 당신의 대답에서 적절한 해결책을 찾을 수 있습니다.하지만 제가 생각한 것과 다른 해결책을 생각해 낼 수 있는지 좀 더 자세히 설명하고 싶습니다. URI에 변수 또는 값이 이미 올 수 있습니다. 그래서 당신이 솔직하게 제안하는 해결책을 할 수있는 것처럼 아닙니다. 나는 regexxp와 일치 할 수 있고 어떤 변수가 있는지 그리고 결과에 따라 말한 것을 할 수 있다고 생각한다. – mpeterson

3

을 스크립트를 사용하여 '내보내기'를 사용하여 변수를 정의하십시오.

export PROTO='http' 
export USER='bob' 
export PASS='password' 
export HOST='myhostname' 
export TARGET='index.html' 

bash ./myscript_with_uri.sh 

또는

은 URI를 반환하는 절차로 URI 스크립트를 작성합니다.

uri_creater.sh

makeUri() 
{ 
    URI="${PROTO}://${USER}:${PASS}@${HOST}/${TARGET} 
} 

script_using_uri.sh

. uri_creater.sh 
PROTO='http' 
USER='bob' 
PASS='password' 
HOST='myhostname' 
TARGET='index.html' 

makeUri 

url="${URI}" 

echo "${url}" 

bash는과를 CentOS 6.5에서 테스트.

+0

1) 'export'명령을 사용하면 변수를 하위 셸에서 사용할 수 있습니다. 2) '.'은 스크립트를 가져옵니다. 3) 변수는 사용될 때 평가됩니다. 그들이 평가되기 전에 설정되어있는 한, 효과가 있습니다. – Doug

관련 문제