bash에서 단일 명령으로 쉘 변수에 기본값 지정


685

변수가 설정되지 않은 경우 bash (3.00) 쉘 스크립트에서 변수에 대한 전체 테스트를 수행합니다. 예를 들어 다음과 같이 기본값이 지정됩니다.

if [ -z "${VARIABLE}" ]; then 
    FOO='default'
else 
    FOO=${VARIABLE}
fi

한 줄로 이것을 수행하는 몇 가지 구문이 있습니다. 예를 들어 삼항 연산자와 비슷한 것입니다.

FOO=${ ${VARIABLE} : 'default' }

(나는 그것이 작동하지 않는다는 것을 알고 있지만 ...)

내가 미쳤나요, 아니면 그런 것이 있습니까?


1
bash 셸 참조의 Shell Parameter Expansion 섹션은 좋은 시작 위치입니다 ( tiswww.case.edu/php/chet/bash/bashref.html#Shell-Expansions) .
Kemin Zhou

1
Shell Parameter Expansion에 대한 Gnu.org 문서 (힌트 : 할 수있는 멋진 것들이 많이 있습니다!)
JDB는 여전히 Monica

답변:


1229

실제로 게시 한 내용에 매우 가깝습니다.

FOO=${VARIABLE:-default}  # If variable not set or null, use default.

또는 다음에도 할당 default됩니다 VARIABLE.

FOO=${VARIABLE:=default}  # If variable not set or null, set it to default.

64
설명서 에서이 내용을 찾으려면 Google은 무엇을해야합니까? $ {:-}와 같은 특수 문자를 사용한 인터넷 검색은 쉽지 않습니다.
Joshua Olson

20
solarmist 님의 질문에 "bash는 변수 할당의 기본"이 페이지에 저를 보자, 그리고 '변수 엉덩이'로 검색 배쉬의 매뉴얼 페이지 ~ 오 '다음'후 오른쪽 부분에 저를 얻었다
Mooshu

57
bash 특정아니며 전체 셸 제품군에서 작동합니다. 일반 스크립트에 안전합니다.
Jocelyn delalande '

16
@solarmist 핵심 단어는 "bash parameter expansion"입니다.
duleshi

20
여기에 주제에 대한보다 깊이있는 설명이다 unix.stackexchange.com/a/122848/2407
jottr

290

명령 행 인수의 경우 :

VARIABLE=${1:-DEFAULTVALUE}    

에있는 양수인 VARIABLE스크립트 또는 값에 전달 된 첫 번째 인수의 값 DEFAULTVALUE그러한 인수가 전달되지 않은 경우.


244

변수가 동일하면

: "${VARIABLE:=DEFAULT_VALUE}"

정의되지 않은 경우 DEFAULT_VALUE를 VARIABLE에 할당합니다. 큰 따옴표는 글 로빙 및 단어 분리를 방지합니다.

Bash 매뉴얼의 3.5.3 절, Shell Parameter Expansion을 참조하십시오 .


27
이 까다로운 트릭은 : {..}} 확장을 먹기 위해 내장 된 no-effect를 사용하여 나에게 분명하지 않았습니다. 지금까지 나는 VARIABLE = "$ {VARIABLE : -DEFAULT_VALUE}"을하고 VARIABLE을 두 번 사용했을 때 황홀한 느낌을 받았습니다.
dino

이것은 항상 BASH-BUILTIN 변수에 대해 작동하지 않습니다. 매우 이상합니다. 현재 저에게 알려진 사람들은HISTTIMEFORMAT
Otheus

여러 기본값을 어떻게 설정합니까? ": $ {VARIABLE : = DEFAULT_VALUE} : $ {VARIABLE2 : = DEFAULT_VALUE2}"시도했지만 작동하지 않는 것 같습니다.
Hans

8
@Hans : 콜론은 (아무것도하지 않는) 명령이므로 한 번만 필요합니다. 예: ${FOO:=DEFAULT1} ${BAR:=DEFAULT2}
패트릭

36

다른 변수의 값을 기본값처럼 사용할 수 있습니다.

파일을 가지고 defvalue.sh

#!/bin/bash
variable1=$1
variable2=${2:-$variable1}

echo $variable1
echo $variable2

./defvalue.sh first-value second-value출력을 실행

first-value
second-value

./defvalue.sh first-value출력을 실행

first-value
first-value

28

참조 여기 3.5.3 (쉘 확장 파라미터)에 따라

그래서 당신의 경우

${VARIABLE:-default}

26

귀하의 질문에 답변하고 모든 변수 대체에

echo "$\{var}"
echo "Substitute the value of var."


echo "$\{var:-word}"
echo "If var is null or unset, word is substituted for var. The value of var does not change."


echo "$\{var:=word}"
echo "If var is null or unset, var is set to the value of word."


echo "$\{var:?message}"
echo "If var is null or unset, message is printed to standard error. This checks that variables are set correctly."


echo "$\{var:+word}"
echo "If var is set, word is substituted for var. The value of var does not change."

18

다음과 같은 오류 메시지를 제공 할 수 있습니다.

USERNAME=${1:?"Specify a username"}

다음과 같은 메시지가 표시되고 코드 1로 종료됩니다.

./myscript.sh
./myscript.sh: line 2: 1: Specify a username

모든 것의 더 완전한 예 :

#!/bin/bash
ACTION=${1:?"Specify 'action' as argv[1]"}
DIRNAME=${2:-$PWD}
OUTPUT_DIR=${3:-${HOMEDIR:-"/tmp"}}

echo "$ACTION"
echo "$DIRNAME"
echo "$OUTPUT_DIR"

산출:

$ ./script.sh foo
foo
/path/to/pwd
/tmp

$ export HOMEDIR=/home/myuser
$ ./script.sh foo
foo
/path/to/pwd
/home/myuser
  • $ACTION 첫 번째 인수의 값을 취하고 비어 있으면 종료됩니다.
  • $DIRNAME 두 번째 인수이며 기본값은 현재 디렉토리입니다.
  • $OUTPUT_DIR는 세 번째 인수이거나 $HOMEDIR(정의 된 경우) 그렇지 않은 경우 /tmp입니다. 이것은 OS X에서 작동하지만 이식성에 대해서는 긍정적이지 않습니다.

17

그런 다음 'if'구문을 더 간결하게 표현하는 방법이 있습니다.

FOO='default'
[ -n "${VARIABLE}" ] && FOO=${VARIABLE}

10

여기에 예가 있습니다

#!/bin/bash

default='default_value'
value=${1:-$default}

echo "value: [$value]"

이것을 script.sh로 저장하고 실행 가능하게 만드십시오. 매개 변수없이 실행

./script.sh
> value: [default_value]

param으로 실행

./script.sh my_value
> value: [my_value]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.