2016-09-16 4 views
1

나는 env 인쇄의 변수를 반복하고 싶습니다 :키와 값을 출력하는 모든 ENV 변수를 반복하는 방법은 무엇입니까?

name: ${name} value: ${value} 

단순히 줄 바꿈 및 반복하는 의해 분할 때문에 여러 줄 값, 예를 들어,의, 작동하지 않습니다

SERVER_TLS_SERVER_CRT=-----BEGIN CERTIFICATE----- 
foo 
-----END CERTIFICATE----- 

사용 케이스 --env-file 통해 멀티 라인 변수를 제한하는 전달 Docker limitation를 해결하는 것이다.

답변

1

다음은 #bash의 해결책입니다.

unset IFS 
args=() i=0 
for var in $(compgen -e); do 
    printf -v 'args[i++]' -e%s=%s "$var" "${!var}" 
done 

나는 처음에 따라서의 printf %의 q는 필요하다고 생각은, 출력라고 생각하지만, 그냥 인수 배열을 만들 때 그 사건이 아니다, 그래서이 단순화 될 수있다

unset IFS 
args=() 
for var in $(compgen -e); do 
    args+=("-e$var=${!var}") 
done 
3

당신은 널 (null)이 name=value쌍 목록을 종료 얻을 env -0를 사용하여 반복하는 루프를 사용할 수 있습니다 스크립트 사용 위

while IFS='=' read -r -d '' n v; do 
    printf "'%s'='%s'\n" "$n" "$v" 
done < <(env -0) 

떠들썩한 기능입니다 프로세스 대체을. 구형 셸에서는 파이프 라인을 사용할 수 있습니다.

env -0 | while IFS='=' read -r -d '' n v; do 
    printf "'%s'='%s'\n" "$n" "$v" 
done 
+0

I을 이것을 다른 스레드에서 잘라내는 것을 보았습니다. ''./foo.sh : 예기치 않은 토큰 근처에 구문 오류가 있습니다. '<'\ n ./foo.sh : 3 행 :'done <((env -0) ')'' – Gajus

+0

왜냐하면 당신은'배쉬 '를 사용하지 않기 때문입니다. 스크립트를 실행하기 위해'bash '를 사용하고 있는지 확인하십시오. 아니면 다음을 사용하십시오 :'env -0 | IFS = '='read -r -d ''n v; printf '{ "name": "% s", "value": "% s"} \ n ""$ n ""$ v "; 처리 대체를 피할 수 있습니다. – anubhava

+1

오, 바보. 나는 zsh를 잊어 버리고있다. 고맙습니다. – Gajus

관련 문제