2016-09-02 2 views
29

쉘 스크립트를 작성 중입니다. 이 셸 스크립트에서 기본값 또는 환경 변수의 값을 취하는 변수가 있습니다. 그러나 환경 변수가 없어도됩니다.쉘 스크립트 : 환경 변수가 있는지 확인하고 그 값을 얻는 방법?

export DEPLOY_ENV=dev 

가 어떻게이 환경 변수를 검색하고 스크립트 내부 변수에 값을 저장하기 위해 스크립트를 말할까요 : 인스턴스가, 가정을 위해

는 스크립트를 실행하기 전에, 나는 다음과 같은 작업을 수행 . 또한 스크립트에이 환경 변수가없는 경우 기본 변수를 저장하는 방법은 무엇입니까?

+1

'의 printenv DEPLOY_ENV' 테스트 목적으로, 나는 시도 그것을 tempV = $ (의 printenv LANG)를 – sjsam

+0

을해야 그것이했다 : 그러나, 나는 다음과 같이 나는의 sudoers 파일에 도착하는 데 필요한 변수를 추가했다 시스템이 LANG 값을 가지고 있음에도 불구하고 아무 것도 인쇄하지 않습니다 –

+0

귀하의 진술 문은 "인쇄"되지 않습니다. 쉘 변수'tempV'에 환경 변수'LANG'의 값을 저장합니다. 이 스레드의 다른 제안은 다음과 같습니다. 환경 변수 또는 셸 변수 중 어느 것이 있는지 구별 할 수 없습니다. 이러한 구분이 중요한 경우 @sjsam이 제안한 해결책을 고려해야합니다. – user1934428

답변

57
if [[ -z "${DEPLOY_ENV}" ]]; then 
    MY_SCRIPT_VARIABLE="Some default value because DEPLOY_ENV is undefined" 
else 
    MY_SCRIPT_VARIABLE="${DEPLOY_ENV}" 
fi 

# or using a short-hand version 

[[ -z "${DEPLOY_ENV}" ]] && MyVar='default' || MyVar="${DEPLOY_ENV}" 

# or even shorter use 

MyVar="${DEPLOY_ENV:-default_value}" 
33

당신은 parameter expansion을 사용할 수

$ {매개 변수 : -Word}

매개 변수가 설정 또는 null의 경우, 단어의 확장이 대체됩니다. 그렇지 않으면 매개 변수의 값이 대체됩니다.

그래서이 시도 : 또한 $ 매개 변수이 설정되지 않은 경우에만 기본값을 대체 (하지만이 null입니다하지 않을 경우) {매개 변수 단어} 형태있다

var=${DEPLOY_ENV:-default_value} 

. 스크립트에서 환경 변수와 변수 사이에는 차이가 없습니다

$ unset DEPLOY_ENV 
$ echo "'${DEPLOY_ENV:-default_value}' '${DEPLOY_ENV-default_value}'" 
'default_value' 'default_value' 
$ DEPLOY_ENV= 
$ echo "'${DEPLOY_ENV:-default_value}' '${DEPLOY_ENV-default_value}'" 
'default_value' '' 
+1

나를 두들겨 라. 이것은 내가 할 수있는 가장 좋은 방법이라고 생각합니다 – sjsam

+0

내 스크립트가 DEPLOY_ENV의 값을 읽을 수 없었습니다. 환경 변수가 시스템에 존재하는지 확인하기 위해 터미널에 printenv DEPLOY_ENV와 올바른 값을 썼습니다. 반환되었습니다. 그러나 스크립트에서 가져올 수 없습니다. –

+0

그건 분명히 최선의 방법입니다. 새로운 것을 가르쳐 줬어. +! –

2

:

는 둘 사이의 차이를 설명합니다. 환경 변수는 스크립트가 호출되기 전에 스크립트 외부에서 먼저 정의됩니다. 스크립트의 관점에서 변수는 변수입니다.

if [ -z "$a" ] 
then 
    echo "not defined" 
else 
    echo "defined" 
fi 

을하고 정의되지 않은 변수에 대한 기본 값을 설정하거나 다른 일을 수행

당신은 변수가 정의되어 있는지 확인 할 수 있습니다.

-z은 길이가 0 인 (즉, 비어있는) 문자열을 검사합니다. man bash을 참조하고 조건 표현을 찾으십시오.

스크립트 시작 부분에 set -u을 사용하면 정의되지 않은 변수가 창의적인 방식으로 중단되지 않도록하려는 경우 정의되지 않은 변수가 발견되면 실패하게 만들 수 있습니다.

8

당신이 설정되지 않은 변수 또는 빈 값의 변수 사이의 차이에 대해 걱정하지 않는 경우 기본 값 매개 변수 확장 사용할 수 있습니다 : 당신이을 경우

foo=${DEPLOY_ENV:-default} 

을 콜론

foo=${DEPLOY_ENV-default} 

또한 매개 변수가 설정되어있는 경우 명시 적으로 테스트 할 -v 연산자를 사용할 수 드롭의 차이에 대해 신경.

if [[ ! -v DEPLOY_ENV ]]; then 
    echo "DEPLOY_ENV is not set" 
elif [[ -z "$DEPLOY_ENV" ]]; then 
    echo "DEPLOY_ENV is set to the empty string" 
else 
    echo "DEPLOY_ENV has the value: $DEPLOY_ENV" 
fi 
+0

'-v' 옵션은 Bash 4.2에서 소개되었으며, 많은 시스템은 여전히 ​​이전 버전의 Bash를 실행 중임을 참고하십시오. – pjh

+3

'bash' 4.2조차도 5 살이 넘었습니다. 나는 그 문제에 특별한 언급을 할 가치가있는 특별한 경우로서 더 오래된 것을 다루는 경향이있다. – chepner

+1

시간이 얼마나 걸리는지 놀랍습니다 ... –

1
NEW_VAR="" 
if [[ ${ENV_VAR} && ${ENV_VAR-x} ]]; then 
    NEW_VAR=${ENV_VAR} 
else 
    NEW_VAR="new value" 
fi 
0

모든 대답했다.

sudo visudo 
Defaults env_keep += "<var1>, <var2>, ..., <varn>" 
관련 문제