programing

bash에서 단일 명령을 사용하여 셸 변수에 기본값 할당

lastcode 2023. 4. 17. 21:54
반응형

bash에서 단일 명령을 사용하여 셸 변수에 기본값 할당

bash(3.00) 셸 스크립트의 변수에 대한 많은 테스트가 있습니다.변수가 설정되어 있지 않으면 다음과 같은 기본값이 할당됩니다.

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

한 줄에 이 작업을 수행할 때 다음과 같은 3진 연산자와 유사한 구문이 있는 것으로 기억합니다.

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

(그게 안 된다는 건 알지만...)

내가 미친 걸까, 아니면 그런 게 존재하는 걸까?

사실 네가 올린 글이랑 아주 비슷해이를 위해서는 Bash 파라미터 확장이라고 하는 을 사용할 수 있습니다.

할당된 값을 가져오려면 또는default누락된 경우:

FOO="${VARIABLE:-default}"  # If variable not set or null, use default.
# If VARIABLE was unset or null, it still is after this (no assignment done).

또는 할당하기 위해default로.VARIABLE동시에:

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

명령줄 인수의 경우:

VARIABLE="${1:-$DEFAULTVALUE}"

에 할당됩니다.VARIABLE스크립트에 전달된 첫 번째 인수 값 또는 값DEFAULTVALUE만약 그런 주장이 통과되지 않았다면.따옴표는 글러빙과 단어 분할을 방지합니다.

변수가 같으면

: "${VARIABLE:=DEFAULT_VALUE}"

할당하다DEFAULT_VALUE로.VARIABLE정의되지 않은 경우.

  • 콜론이 내장되어 있다(:)는 변수 결과가 실행되지 않도록 합니다.
  • 큰따옴표(")는 글러빙 및 단어 분할을 방지합니다.

Bash 매뉴얼의 섹션 3.5.3 "쉘 매개 변수 확장"을 참조하십시오.

질문에 대한 답변과 모든 변수 대체에 대한 답변

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."

달러 기호와 나머지 표현식 사이에 \를 넣으면 표현식 전체를 벗어날 수 있습니다.

echo "$\{var}"

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

파일을 가지고 있다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

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

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(정의되어 있는 경우), 그렇지 않은 경우/tmpOS X에서는 동작합니다만, 휴대성이 좋은 것은 아닙니다.

3.5.3(쉘 매개 변수 확장)에서 여기를 참조하십시오.

그래서 당신의 경우

${VARIABLE:-default}

다음과 같이 기본값을 체인할 수 있습니다.

DOCKER_LABEL=${GIT_TAG:-${GIT_COMMIT_AND_DATE:-latest}}

즉,$GIT_TAG존재하지 않습니다.테이크$GIT_COMMIT_AND_DATE- 이것이 존재하지 않는 경우,"latest"

다음으로, 「만약」구조를 보다 간결하게 표현하는 방법이 있습니다.

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

여기 예가 있습니다.

#!/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]

if-then-else에 1개의 라이너를 원하는 경우 다음과 같이 다시 쓰는 것을 고려해 보십시오.

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

세미콜론 포함:

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

는, 를, 를, 를, 를, 를, 습, 습, 습을 수 있다.if-then-else-fi다음과 같은 부울 연산자를 사용하는 경우 키워드를 지정합니다.

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

일반화하면 부울 연산자 패턴은 다음과 같습니다.

conditional && then_command || else_command

언급URL : https://stackoverflow.com/questions/2013547/assigning-default-values-to-shell-variables-with-a-single-command-in-bash

반응형