환경 변수에 저장된 명령 평가

환경 변수에 저장된 명령 평가

수정이 제한되거나 수정 능력이 없는 bash 스크립트는 다음 환경 변수를 사용합니다.

"${SERVER_ADDRESS}"

실제 SERVER_ADDRESS 값은 런타임 시에만 동적으로 결정될 수 있으므로 IP를 찾는 컬 명령에 SERVER_ADDRESS를 설정하려고 합니다. 그것은 다음과 같습니다:

SERVER_ADDRESS='curl -s http://lookup.api.com'

이것을 더 복잡하게 만드는 것은 실제 조회가 필요한 주소의 일부만 반환하므로 실제로 필요한 것은 일종의 연결입니다.

SERVER_ADDRESS='$(curl -s http://lookup.api.com).restofaddress.com'

이는 문자열이 환경 변수에 할당되면 컬 명령이 실행되고 평가되지만 실행되는 동안 스크립트 내에서 평가를 수행해야 함을 의미합니다.

"${SERVER_ADDRESS}"만 포함하는 스크립트가 올바른 값으로 끝나도록 해당 환경 변수의 텍스트 형식을 지정하기 위해 가능한 모든 것을 시도했지만 당황했습니다. 어쩌면 수신 스크립트에 복잡성을 더하지 않으면 불가능할 수도 있습니다.

답변1

작은따옴표 대신 큰따옴표를 사용하세요.

SERVER_ADDRESS="$(curl -s http://lookup.api.com).restofaddress.com"

보간 및 확장(예: 여기의 경우 변수 확장 또는 명령 확장)은 큰따옴표로 묶인 문자열 내에서 수행되지만 작은따옴표로 묶인 문자열 내에서는 수행되지 않습니다.

답변2

jayhendren이 말했듯이 변수를 삽입하려면 큰따옴표를 사용해야 합니다. 그러나 변수 이름이 유효한 변수 이름 문자 바로 옆에 있는 경우 이름을 중괄호로 묶어 변수 이름이 시작하고 끝나는 위치를 bash에 알려야 합니다. 코드처럼 보이지만 원하는 결과를 제공하기 위해 실행되지 않는 것(또는 매우 멋진 fqdn을 생성하는 것)이라는 측면에서 문제를 설명할 때 의미하는 바를 파악하기는 어렵지만 비슷한 작업을 수행해야 한다고 생각합니다. ..

ADDR="http://lookup.api.com/"
export ADDR
...
curl -s -o "${OUTPUTFILE}" "${ADDR}some/path"

아니면 실제로 검색하려는 URL이 다음에서 반환된 조각으로 구성되어 있다는 의미입니까?http://lookup.api.com? 그렇다면 큰 막대기를 찾아서 "302! 302! 302!"라고 외치며 API를 작성한 사람을 반복해서 때리면 됩니다. 그들이 당신보다 훨씬 크거나 총을 가지고 있다면 jayhedren이 제안한 접근 방식을 고려할 수 있지만 우아하고 단순하지만 특별히 강력한 솔루션은 아닙니다. 다음을 고려하십시오:

FRAG=`curl -s -o "${ADDR}some/path" | tr -d '\040\011\012\015'`
curl -s -o "${OUTPUTFILE}" "${ADDR}some/path"

관련 정보