스크립트에서 변수 할당에 “ $ {a : -b} ” 사용

다른 사람들이 작성한 스크립트 (특히 Red Hat) 몇 개를 살펴 보았으며, 많은 변수가 다음 표기법 VARIABLE1="${VARIABLE1:-some_val}" 또는 일부 확장 기타를 사용하여 할당되었습니다. 변수 VARIABLE2="${VARIABLE2:-`echo $VARIABLE1`}"

값을 직접 선언하는 대신이 표기법을 사용하는 이유 (예 : VARIABLE1=some_val )?

이 표기법의 이점이 있습니까? 아니면 예방할 수있는 오류가 있습니까?

:-가이 문맥에서 특정한 의미를 가지고 있습니까? ?

댓글

  • man bash를 살펴보세요. 블록 ” 매개 변수 확장 ” (약 28 %)을 검색합니다. 이러한 할당은 예입니다. 기본 기능 : ” 아직 설정되지 않은 경우에만 기본값을 사용합니다. ”
  • 는 기본값을 설정하고 :+는 변수가 다음과 같은 경우 값을 변경 하는 데 사용됩니다. null이 아닙니다. 예 : v=option; cmd ${v:+ with $v} cmd (옵션 포함) “가 실행됩니다. 그러나 $ v가 null이면 ” cmd ” 만 실행됩니다.

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 

핸디 댄디 참조 테이블

        ss of table

참조

설명

  • 이러한 모든 확장이 bash. Q의 ${var:-word} 항목은 위의 ${var-word}가 아닙니다. POSIX 문서에는 멋진 테이블이 있지만 복사 할 가치가 있습니다. 답변- pubs.opengroup.org/onlinepubs/9699919799/utilities/ …
  • @Graeme, 문서화되어 있습니다. 콜론을 생략하면 설정되지 않은 매개 변수에 대해서만 테스트가 수행됩니다.
  • 는 실제로 echo를 원한다면 좋습니다. 하지만 ‘하지 않으면 : 내장 … : ${FOO:=default} 위와 같이 $FOOdefault로 설정되어 있습니다 (즉, 아직 설정되지 않은 경우). 하지만 ‘ 과정에서 $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의 원래 기본값입니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다