bash는 기본값을 할당


135

$ {parameter : = word} 기본값을 할당하십시오. 매개 변수가 설정되어 있지 않거나 널 (null)이면 단어의 확장이 매개 변수에 지정됩니다. 그런 다음 매개 변수 값이 대체됩니다. 이러한 방식으로 위치 매개 변수 및 특수 매개 변수를 지정할 수 없습니다.

나는이 기능을 사용하여 long ${LONG_VARIABLE_NAME:=hello}대신 쓸 수 있다고 생각 LONG_VARIABLE_NAME=${LONG_VARIABLE_NAME:-hello}했지만 bash는 'hello'를 실행하려고 시도하여 명령을 찾을 수 없습니다. 그것을 피할 수있는 방법이 있습니까? 아니면 후자를 고수해야합니까? 누군가가 기본값 할당이 실제로 유용한 예를 줄 수 있습니까?


13
텍스트를 인용 할 때 소스에 대한 링크를 포함시키는 것이 도움이됩니다.
Jonathon Reinhart 2016 년

답변:


202

콜론을 사용하십시오.

: ${A:=hello}

콜론은 아무것도하지 않고 인수를 무시하는 널 명령입니다. bash에 내장되어 있으므로 새 프로세스가 작성되지 않습니다.


93
나는 도울 수 없지만 그 : ${A:=hello}길이는 A=${A:-hello}. 또한 후자는 좀 덜 난해하고 그 의도는 더 분명한 것 같습니다. 사용 :기본적으로 어떠한 조합이다없는, 영업 이익 전에 그 일을 한 방법과 비교하여 미봉책 보인다.
Dan Molding

5
@ camh : 동의합니다. 기본값으로 초기화 할 변수가 많고 이름이 긴 :경우 입력 및 읽기에 대한 접근 방식이 선호됩니다. 예, 이것은 Bash가 약간의 개선을 사용할 수있는 영역처럼 보입니다.
Dan Molding

17
@ DanMoulding : : ${VERY_LONG_VARIABLE_NAME:=hello}대 어떻습니까 : VERY_LONG_VARIABLE_NAME=${VERY_LONG_VARIABLE_NAME:-hello}. 코드에 설명 변수 이름을 사용하기를 바랍니다. :)
pihentagy

18
짧을뿐만 아니라 오류가 적은 경향이 VERY_LONG_VARIABLE_NAME=${VERY_LOGN_VARIABLE_NAME:-hello}있습니다. 죄송합니다.
chepner

5
이 방법의 장점은로 A=$A:-hello실행할 때 자체 문서화라는 것입니다 set -x. 즉, 할당은로 인쇄 A=hello되지만 null 명령은 값 ( hello) 만 인쇄합니다 .
lmsurprenant

107

제발 봐 http://www.tldp.org/LDP/abs/html/parameter-substitution.html 예제

${parameter-default}, ${parameter:-default}

매개 변수를 설정하지 않으면 기본값을 사용하십시오. 호출 후에도 매개 변수가 설정되지 않았습니다.
두 형태는 거의 동일합니다. 엑스트라 :는 매개 변수가 선언되었지만 널인 경우에만 차이를 만듭니다.

unset EGGS
echo 1 ${EGGS-spam}   # 1 spam
echo 2 ${EGGS:-spam}  # 2 spam

EGGS=
echo 3 ${EGGS-spam}   # 3
echo 4 ${EGGS:-spam}  # 4 spam

EGGS=cheese
echo 5 ${EGGS-spam}   # 5 cheese
echo 6 ${EGGS:-spam}  # 6 cheese

${parameter=default}, ${parameter:=default}

매개 변수가 설정되지 않은 경우 매개 변수 값을 기본값으로 설정하십시오.
두 형태 모두 거의 동일합니다. : : 매개 변수가 선언되고 널인 경우에만 차이를 만듭니다.

# sets variable without needing to reassign
# colons suppress attempting to run the string
unset EGGS
: ${EGGS=spam}
echo 1 $EGGS     # 1 spam
unset EGGS
: ${EGGS:=spam}
echo 2 $EGGS     # 2 spam

EGGS=
: ${EGGS=spam}
echo 3 $EGGS     # 3        (set, but blank -> leaves alone)
EGGS=
: ${EGGS:=spam}
echo 4 $EGGS     # 4 spam

EGGS=cheese
: ${EGGS:=spam}
echo 5 $EGGS     # 5 cheese
EGGS=cheese
: ${EGGS=spam}
echo 6 $EGGS     # 6 cheese

${parameter+alt_value}, ${parameter:+alt_value}

매개 변수가 설정되면 alt_value를 사용하고, 그렇지 않으면 널 문자열을 사용하십시오. 호출 후에는 매개 변수 값이 변경되지 않았습니다.
두 형태 모두 거의 동일합니다. : : 매개 변수가 선언되고 널인 경우에만 차이를 만듭니다.

unset EGGS
echo 1 ${EGGS+spam}  # 1
echo 2 ${EGGS:+spam} # 2

EGGS=
echo 3 ${EGGS+spam}  # 3 spam
echo 4 ${EGGS:+spam} # 4

EGGS=cheese
echo 5 ${EGGS+spam}  # 5 spam
echo 6 ${EGGS:+spam} # 6 spam

20

기본값 매개 변수 확장은 종종 아래 예제와 같은 빌드 스크립트에서 유용합니다. 사용자가 스크립트를있는 그대로 만 호출하면 perl이 내장되지 않습니다. 사용자가 명시 적으로 WITH_PERL"no"이외의 값 으로 설정 해야 스크립트가 내장됩니다.

$ cat defvar.sh
#!/bin/bash

WITH_PERL=${WITH_PERL:-no}

if [[ "$WITH_PERL" != no ]]; then
    echo "building with perl"
    # ./configure --enable=perl
else
    echo "not building with perl"
    # ./configure
fi

없이 빌드

$ ./defvar.sh
not building with perl

빌드

$ WITH_PERL=yes ./defvar.sh
building with perl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.