[bash] bash는 기본값을 할당

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

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



답변

콜론을 사용하십시오.

: ${A:=hello}

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


답변

제발 봐 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


답변

기본값 매개 변수 확장은 종종 아래 예제와 같은 빌드 스크립트에서 유용합니다. 사용자가 스크립트를있는 그대로 만 호출하면 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


답변