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.c
foo
comp foo.c fu
foo.c
fu
이는 기본값과 함께 여러 매개변수를 사용하려는 경우 특히 중요합니다.
일부 명령${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
발생할 수 있습니다 . 특정 조건에서 변수 이름을 잘못 입력하거나 변수 정의를 잊어버려서 발생하는 오류를 쉽게 발견할 수 있다는 장점이 있습니다. 그러나 설정되지 않은 변수가 항상 확장될 수 있다고 가정하지 않는 스크립트에서만 사용할 수 있습니다.$var
var
set -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
"과잉 확인"이 아니라 "기본값 설정"입니다. 즉, 값이 설정되지 않은(또는 비어 있는 경우) 기본값이 사용됩니다.