쉘에서 ":-"의 사용법과 장점

쉘에서 ":-"의 사용법과 장점

korn 쉘 스크립트에서 다음 줄을 찾았습니다.

var=${var:-/temp}

무슨 일을 하는지 알 수 있었어요

$ var=/data
$ var=${var:-/temp}
$ echo $var
/data
$ var=
$ echo $var

$ var=${var:-/temp}
$ echo $var
/temp

값을 확인한 다음 할당하는 것보다 이점이 있습니까?

답변1

두 개의 명령(예: [[ -z $var ]] && var=/temp)이나 복잡한 명령(예:

if [[ -z $var ]]
then
    var=/temp
fi

게다가 변수에 조건부 값을 할당할 필요도 없습니다. 예를 들어,

#!/bin/sh
prog="$1"
# Do sanity checks & input validation here.
cc "$prog" -o "${2:-$(basename "$prog")}"

호출되면 컴파일된 출력을 comp foo.c컴파일하고 작성합니다 . 그러나 컴파일된 출력을 컴파일 하고 작성합니다 .foo.cfoocomp foo.c fufoo.cfu

이는 기본값과 함께 여러 매개변수를 사용하려는 경우 특히 중요합니다.

일부 명령${1:-기본값 1${2:-기본값 2${3:-기본값 3${4:-기본값 4${5:-기본값 5} ${6:-기본값 6${7:-기본값 7${8:-기본값 8${9:-기본값 9}

반대로 매개변수를 설정하려면 약 18개의 명령이 필요합니다.

변수에 조건부 값을 할당할 필요 없이 이 기능을 사용하는 방법에 대한 또 다른 예는 사용자가 파일을 편집할 수 있도록 하는 스크립트입니다.

#!/bin/sh
파일 =무엇
"$(편집자:-vi}" "$file"

사용자가 선호하는 편집기( EDITOR환경 변수를 통해 지정)를 호출하거나 vi사용자가 편집기를 지정하지 않은 경우 호출합니다.

답변2

세 가지 경우가 있습니다. var처음에 설정되지 않거나, 비어 있거나, 비어 있지 않을 수 있습니다. 처음 두 경우에는 로 설정되고 /temp, 마지막 경우에는 그대로 유지됩니다.

동일한 작업을 수행하는 또 다른 방법은 다음과 같습니다.

: "${var:=/temp}"

퀘스트 체인이 더 명확하기 때문에 나는 그것을 선호하지만 미학적 문제입니다.

일반 설정에서는 다음과 같습니다.

if [ -z "$var" ]; then var="/temp"; fi

이것은 더 명확해질 수 있습니다. 그러나 구문 ${var:-…}또는 ${var:=…}에는 장점이 있습니다. 설정되지 않은 경우에도 작동하여 오류가 set -u발생할 수 있습니다 . 특정 조건에서 변수 이름을 잘못 입력하거나 변수 정의를 잊어버려서 발생하는 오류를 쉽게 발견할 수 있다는 장점이 있습니다. 그러나 설정되지 않은 변수가 항상 확장될 수 있다고 가정하지 않는 스크립트에서만 사용할 수 있습니다.$varvarset -u

답변3

그것은간결한 관용구. 당신은 그것을 사용할 수 있습니다대기줄명령을 실행할 위치:

cmd "${arg1}" "${arg2}" "${arg3:-42}"

또는 프로그램 시작 부분에서(또는 함수의 첫 번째 명령문으로)매개변수 인터페이스 주장( :명령 사용):

: "${1:?} ${2:?}"

또는 프로그램이나 해당 작업에서 조작하는 의미론적으로 명명된 변수에 이를 확인하고 할당합니다. 기능:

foo=${1:?} bar=${2:?} baz=${3:-42}

처음 두 매개변수(이 경우)가 필수인 경우 세 번째 매개변수는 제공되지 않을 경우 기본값(위의 "42")을 갖습니다.

관련 항목이 위치 매개변수가 아니라 변수인 경우 관련 구문 ${var:=val}(또는 관련 )을 사용하여 이를 달성할 수도 있습니다.${var=val}

: "${foo:=${1:?}} ${bar:=${2:?}} ${baz:=${3:-42}}"

이 관용어의 ${var:-42}변형도 있습니다 ${var-42}(즉, :콜론 없음).구별하다 설정되지 않음매개변수는 다음에서 옵니다.비어 있는매개변수는 test생성자를 직접 구별할 수 없습니다.비어 있는변수는 다음에서 옵니다.설정되지 않음변하기 쉬운.

답변4

"과잉 확인"이 아니라 "기본값 설정"입니다. 즉, 값이 설정되지 않은(또는 비어 있는 경우) 기본값이 사용됩니다.

관련 정보