: ${param:=value}는 무엇을 의미하나요?

: ${param:=value}는 무엇을 의미하나요?

나는 다음을 읽었습니다Z-쉘 사용자 가이드:

"true"의 동의어는 ":"입니다. 이 형식에서는 부작용이 있지만 사용해서는 안 되는 매개변수를 제공하는 데 자주 사용됩니다.

: ${param:=value}

이는 모든 Bourne 쉘 파생물에서 공통적으로 사용되는 관용어입니다. 매개변수 확장에서는 $param이전에 비어 있었던 경우 value 값이 주어지고, 그렇지 않으면 처리되지 않습니다. 이것이 매개변수 확장의 유일한 이유이므로 일반적으로 :이 매개변수를 무시합니다. 실제로 쉘은 명령줄을 쉽게 구성하고( $param할당 여부에 관계없이 콜론 뒤에 is 값이 옴) 명령을 실행합니다. ':'는 주어진 인수를 인식하지 못합니다.

하지만 이해가 안 돼요. 알겠습니다 :. true하지만 표현식에 콜론이 두 개 있습니다. 작은 질문으로, 모든 Bourne 쉘 파생물에서 이 관용구가 왜 그렇게 많이 사용됩니까? 그 목적은 무엇입니까?

노트: 나는 이 관용구가 두 가지 모두에서 어떤 역할을 하는지에 관심이 있습니다.세게 때리다그리고다루기 힘든.

감사해요

답변1

여러 부분으로 나누어 보겠습니다.

이 코드는 일부 매개변수를 사용하여 명령을 실행합니다 :. 이 명령은 :아무 작업도 수행하지 않으며 해당 인수를 무시합니다. 따라서 전체 명령줄은 매개변수에서 발생하는 부작용 외에는 아무 작업도 수행하지 않습니다.

이 구문은 ${parameter_name:=value}ash, bash, ksh 및 zsh를 포함하여 모든 비골동품 Bourne 스타일 쉘에 존재합니다. 필요한 경우 매개변수를 기본값으로 설정합니다. 그것은 동등하다

if [ -z "$parameter_name" ]; then parameter_name=value; fi
… ${parameter_name}

즉, parameter_name설정되지 않았거나 null 값으로 설정된 경우 표시된 값으로 설정되고 새 매개변수 값으로 명령이 실행됩니다. ${parameter_name=value}인수가 비어 있으면 비워두고 인수가 설정되지 않은 경우 표시된 값만 사용하는 변형이 있습니다 .

이 구문은 "매개변수 확장"에 문서화되어 있습니다.POSIX 사양, 그리고 dash, bash, ksh 및 zsh 매뉴얼을 참조하세요.

이 구문에는 여러 가지 변형이 있으며, 특히 ${parameter_name:-value}매개변수에 할당하지 않고 이 확장에 대한 기본값을 사용할 수 있습니다.

요약하자면 : ${parameter_name:=value}간결한 글쓰기 방식이다.

if [ -z "$parameter_name" ]; then parameter_name=value; fi

답변2

:사실을 의미하지 않습니다. 라고 생각할 수도 있지만 while :해당 표현에서도 "true"를 의미하지 않고 우연히 평가할 뿐입니다(사실 빈 명령이거나 noop일 뿐입니다).

매개변수 확장( ${x:=y})은 "할당"을 의미합니다.와이도착하다엑스만약에엑스설정되지 않았거나 비어 있으며 최종 값을 확장합니다.엑스".

$ echo "${foo:=bar}"
bar
$ foo=baz
$ echo "${foo:=bar}"
baz
$ foo=
$ echo "${foo:=bar}"
bar
$ echo "${foo}"
bar

Bash Hackers wiki에는 매개변수 확장에 대한 좋은 기사가 있습니다.여기.

사용하는 이유 :는 명령의 다른 부분이 평가되더라도 실행되지 않기 때문입니다( :빈 명령과 마찬가지로). 이렇게 하면 ${x:=y}다른 것에 영향을 주지 않고 이미 해당 기능을 실행했습니다. 예를 들어 처음에 그렇지 않은 경우 다음 :과 같은 기능을 실행하려고 시도합니다.와이.

bash도움말 페이지 는 다음과 같습니다 :.

:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

답변3

첫 번째 :는 "noop" 또는 "no Operation"이라는 명령입니다. 맨페이지에 명시된 대로 일반적으로 매개변수를 평가하는 데 사용됩니다.

두 번째 :는 변수 확장의 한정자입니다. 이는 기술적으로 사실입니다 :=. 앞에서 언급했듯이 값이 없으면 값이 설정됩니다.

관용적인 관점에서 볼 때 환경 변수의 기본값이 필요한 경우 이 구문을 사용할 수 있습니다. 예를 들어 를 통해 프로그램을 실행하면 cron(8)환경이 설정되지 않고 쉘의 도트 파일이 실행되지 않습니다. 따라서 일부 기본값을 설정해야 할 수도 있습니다.

: ${JAVA_HOME:=/usr/local/jdk-1.6.0_28}

그런 다음 "설정하고 잊어버릴" 수 있습니다(기본 jvm이 변경될 때까지).

관련 정보