다른 사람들이 작성한 스크립트 (특히 Red Hat) 몇 개를 살펴 보았으며, 많은 변수가 다음 표기법 VARIABLE1="${VARIABLE1:-some_val}"
또는 일부 확장 기타를 사용하여 할당되었습니다. 변수 VARIABLE2="${VARIABLE2:-`echo $VARIABLE1`}"
값을 직접 선언하는 대신이 표기법을 사용하는 이유 (예 : VARIABLE1=some_val
)?
이 표기법의 이점이 있습니까? 아니면 예방할 수있는 오류가 있습니까?
:-
가이 문맥에서 특정한 의미를 가지고 있습니까? ?
댓글
Answer
이 기술을 사용하면 다른 변수가 비어 있거나 정의되지 않은 경우 변수에 값을 할당 할 수 있습니다. 참고 : 이 “기타 변수”는 동일하거나 다른 변수 일 수 있습니다.
발췌
${parameter:-word} If parameter is unset or null, the expansion of word is substituted. Otherwise, the value of parameter is substituted.
참고 : 양식도 작동합니다. ${parameter-word}
. Bash 내에서 사용할 수있는 모든 형식의 매개 변수 확장에 대한 전체 목록을보고 싶다면 Bash Hacker의 위키에서 “ 매개 변수 확장 “.
예
변수가 존재하지 않음
$ echo "$VAR1" $ VAR1="${VAR1:-default value}" $ echo "$VAR1" default value
변수 존재
$ VAR1="has value" $ echo "$VAR1" has value $ VAR1="${VAR1:-default value}" $ echo "$VAR1" has value
다른 변수를 평가하거나 표기법의 기본값 부분 내에서 명령을 실행하여 동일한 작업을 수행 할 수 있습니다.
$ VAR2="has another value" $ echo "$VAR2" has another value $ echo "$VAR1" $ $ VAR1="${VAR1:-$VAR2}" $ echo "$VAR1" has another value
더 많은 예
VARX=${VARX-<def. value>}
에 불과한 약간 다른 표기법을 사용할 수도 있습니다.
$ echo "${VAR1-0}" has another value $ echo "${VAR2-0}" has another value $ echo "${VAR3-0}" 0
위에서 $VAR1
& $VAR2
는 “has another value”라는 문자열로 이미 정의되었지만 $VAR3
는 정의되지 않았으므로 대신 기본값이 사용되었습니다. 0
.
다른 예
$ VARX="${VAR3-0}" $ echo "$VARX" 0
:=
표기법을 사용하여 확인 및 할당
마지막으로 편리한 연산자 인 :=
. 이렇게하면 테스트중인 변수가 비어 있거나 정의되지 않은 경우 검사를 수행하고 값을 할당합니다.
예
$VAR1
가 이제 세트. 연산자 :=
가 테스트와 할당을 단일 작업으로 수행했습니다.
$ unset VAR1 $ echo "$VAR1" $ echo "${VAR1:=default}" default $ echo "$VAR1" default
그러나 값이 설정된 경우 이전에는 그대로 두었습니다.
$ VAR1="some value" $ echo "${VAR1:=default}" some value $ echo "$VAR1" some value
핸디 댄디 참조 테이블
참조
설명
- 이러한 모든 확장이
bash
. Q의${var:-word}
항목은 위의${var-word}
가 아닙니다. POSIX 문서에는 멋진 테이블이 있지만 복사 할 가치가 있습니다. 답변- pubs.opengroup.org/onlinepubs/9699919799/utilities/ … - @Graeme, 문서화되어 있습니다. 콜론을 생략하면 설정되지 않은 매개 변수에 대해서만 테스트가 수행됩니다.
- 는 실제로
echo
를 원한다면 좋습니다. 하지만 ‘하지 않으면:
내장 …: ${FOO:=default}
위와 같이$FOO
가default
로 설정되어 있습니다 (즉, 아직 설정되지 않은 경우). 하지만 ‘ 과정에서$FOO
의 에코가 없습니다. - 알겠습니다. stackoverflow.com / q / 24405606 / 1172302 .
${4:-$VAR}
를 사용하면 작동합니다. - 상세한 답변에만 +1. 그러나 훌륭한 bash 위키를 참조한다는 사실에 대해서도 마찬가지입니다. 또한 예와 표를 제공한다는 사실에 대해서도 마찬가지입니다. 지옥, 끝까지 +1합니다. 🙂 저의 경우 거의 구문이 옳았지만 별로는 아니 었습니다. ‘ 맨 페이지를 검색하는 데는 충분히 신경 쓰지 않았습니다. 하지만 ‘ 어떤 제목인지 기억이 나지 않았고 ‘ 오늘 아침 4 시부 터 깨어있었습니다 :() ..
Answer
@slm은 이미 POSIX 문서 -이는 매우 유용하지만 “이 매개 변수를 결합하여 서로에게 영향을 줄 수있는 방법을 실제로 확장하지는 않습니다. 여기에이 형식에 대한 언급이 아직 없습니다.
${var?if unset parent shell dies and this message is output to stderr}
이것은 저의 또 다른 답변 에서 발췌 한 것이며, 이것이 어떻게 작동하는지 매우 잘 보여주고 있다고 생각합니다.
sh <<-\CMD _input_fn() { set -- "$@" #redundant echo ${*?WHERES MY DATA?} #echo is not necessary though shift #sure hope we have more than $1 parameter : ${*?WHERES MY DATA?} #: do nothing, gracefully } _input_fn heres some stuff _input_fn one #here # shell dies - third try doesnt run _input_fn you there? # END CMD heres some stuff one sh: line :5 *: WHERES MY DATA?
동일 의 또 다른 예 :
sh <<-\CMD N= #N is NULL _test=$N #_test is also NULL and v="something you would rather do without" ( #this subshell dies echo "v is ${v+set}: and its value is ${v:+not NULL}" echo "So this ${_test:-"\$_test:="} will equal ${_test:="$v"}" ${_test:+${N:?so you test for it with a little nesting}} echo "sure wish we could do some other things" ) ( #this subshell does some other things unset v #to ensure it is definitely unset echo "But here v is ${v-unset}: ${v:+you certainly wont see this}" echo "So this ${_test:-"\$_test:="} will equal NULL ${_test:="$v"}" ${_test:+${N:?is never substituted}} echo "so now we can do some other things" ) #and even though we set _test and unset v in the subshell echo "_test is still ${_test:-"NULL"} and ${v:+"v is still $v"}" # END CMD v is set: and its value is not NULL So this $_test:= will equal something you would rather do without sh: line 7: N: so you test for it with a little nesting But here v is unset: So this $_test:= will equal NULL so now we can do some other things _test is still NULL and v is still something you would rather do without
위의 예는 POSIX 매개 변수 대체의 4 가지 형식을 모두 활용합니다. 및 다양한 :colon null
또는 not null
테스트. 위 링크와 여기 에 더 많은 정보가 있습니다.
사람들이 “${parameter:+expansion}
에 대해 자주 고려하지 않는 또 다른 점은 여기 문서에서 얼마나 유용 할 수 있는지입니다. 다음은 다른 답변 :
TOP
여기서 몇 가지 기본값을 설정하고 호출시 인쇄 할 준비를합니다 …
#!/bin/sh _top_of_script_pr() ( IFS="$nl" ; set -f #only split at newlines and don"t expand paths printf %s\\n ${strings} ) 3<<-TEMPLATES ${nl= } ${PLACE:="your mother"s house"} ${EVENT:="the unspeakable."} ${ACTION:="heroin"} ${RESULT:="succeed."} ${strings:=" I went to ${PLACE} and saw ${EVENT} If you do ${ACTION} you will ${RESULT} "} #END TEMPLATES
MIDDLE
결과에 따라 인쇄 함수에서 호출 할 다른 함수를 정의하는 곳입니다 …
EVENT="Disney on Ice." _more_important_function() { #...some logic... [ $((1+one)) -ne 2 ] && ACTION="remedial mathematics" _top_of_script_pr } _less_important_function() { #...more logic... one=2 : "${ACTION:="calligraphy"}" _top_of_script_pr }
BOTTOM
이제 모든 설정이 완료되었으므로 여기에서 결과를 실행하고 가져올 수 있습니다.
_less_important_function : "${PLACE:="the cemetery"}" _more_important_function : "${RESULT:="regret it."}" _less_important_function
결과
이유를 잠시 살펴 보지만 위의 내용을 실행하면 다음과 같은 결과가 생성됩니다.
_less_important_function()"s
첫 실행 :어머니의 집에 가서 Disney on Ice
서예 를하면 성공할 것입니다.
ko
_more_important_function():
묘지 em에갔습니다. > 그리고 Disney on Ice를 봤습니다.
수학 수정 을하면 성공할 것입니다.
_less_important_function()
다시 :공동 묘지에 가서 디즈니 온 아이스를 보았습니다.
수학을 고치면 후회할 것입니다.
작동 방식 :
여기서 핵심 기능은 conditional ${parameter} expansion.
의 개념입니다. 변수를 다음과 같이 설정할 수 있습니다. 다음 형식을 사용하여 설정되지 않거나 null 인 경우에만 값 :
${var_name
: =desired_value}
대신에 설정되지 않은 변수 만 설정하려면 및 null 값은 그대로 유지됩니다.
ON SCOPE :
위의 예에서 $PLACE
및 $RESULT
는 parameter expansion
_top_of_script_pr()
가 이미 호출 되었음에도 불구하고 실행시 설정 한 것으로 보입니다. 이것이 작동하는 이유는 _top_of_script_pr()
가 ( subshelled )
함수이기 때문입니다. 다른 항목에 사용되는 { curly braces }
대신 parens
에 있습니다. 하위 셸에서 호출되기 때문에 설정하는 모든 변수는 locally scoped
이며 상위 셸로 돌아 가면 해당 값이 사라집니다.
그러나 _more_important_function()
가 $ACTION
를 설정하면 globally scoped
따라서 _less_important_function()"s
$ACTION
_less_important_function()
는 통해서만 $ACTION
를 설정하기 때문입니다. em> ${parameter:=expansion}.
댓글
- 속기 기본값이 작동하는지 확인하세요. Bourne Shell에서
답변
개인 경험.
나는 때때로 스크립트에서이 형식을 사용하여 값의 임시 재정의를 수행합니다.다음이있는 경우 :
$ cat script.sh SOMETHING="${SOMETHING:-something}"; echo "$SOMETHING";
다음을 실행할 수 있습니다.
$ env SOMETHING="something other than the default value" ./script.sh`
변경할 필요없이 SOMETHING
의 원래 기본값입니다.
man bash
를 살펴보세요. 블록 ” 매개 변수 확장 ” (약 28 %)을 검색합니다. 이러한 할당은 예입니다. 기본 기능 : ” 아직 설정되지 않은 경우에만 기본값을 사용합니다. ”는 기본값을 설정하고
:+
는 변수가 다음과 같은 경우 값을 변경 하는 데 사용됩니다. null이 아닙니다. 예 :v=option; cmd ${v:+ with $v}
” cmd (옵션 포함) “가 실행됩니다. 그러나 $ v가 null이면 ” cmd ” 만 실행됩니다.