[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