무엇을 의미합니까 : $ {param : = value}? 동의어는 ‘:’입니다.

Z-Shell의 사용자 안내서 에서 다음을 읽었습니다 .

‘true’의 동의어는 ‘:’입니다. 부작용이 있지만 사용해서는 안되는 인수를 제공하기 위해 종종이 형식으로 사용됩니다.

: ${param:=value}

이는 모든 Bourne 쉘 파생 상품의 공통 관용구입니다. 매개 변수 확장에서 $param값이 이전에 비어 있으면 값을 제공하고 그렇지 않으면 그대로 둡니다. 이것이 매개 변수 확장의 유일한 이유이므로 :인수를 무시하는 데 사용 합니다. 실제로, 쉘은 명령 행 (콜론과 그 뒤에 값이 무엇이든간에 $param할당이 발생했는지 여부와 상관없이)을 명령 적으로 빌드 한 다음 명령을 실행합니다. ‘:’은 주어진 인수에 대해 아무런 통지도하지 않습니다.

그러나 나는 그것을 이해하지 못한다. 나는 그 :의미를 얻지 true만 표현에는 두 개의 콜론이 있습니다. 사소한 질문으로,이 관용구가 모든 Bourne 쉘 파생물에서 왜 그렇게 많이 사용됩니까? 어떤 목적으로 사용됩니까?

참고 :
이 관용구가 bashzsh 에서 수행하는 작업에 관심이 있습니다.

감사



답변

이것을 조각으로 나누자.

이 코드는 :몇 가지 인수로 명령 을 실행합니다 . 이 명령 :은 아무것도하지 않으며 인수를 무시합니다. 따라서 인수에서 발생하는 부작용을 제외하고 전체 명령 행은 아무 것도 수행하지 않습니다.

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

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

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

이 구문 은 POSIX spec의 “parameter expansion” 및 dash, bash, ksh 및 zsh 매뉴얼에 설명되어 있습니다.

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

요약하면, : ${parameter_name:=value}간결한 글쓰기 방법입니다

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

답변

:사실을 의미하는 것은 아닙니다. 아마도 당신은 아마도 생각하고 while :있지만, 그 표현 에서조차 “참”을 의미하는 것은 아니며 단지 평가에 불과합니다 (사실, 단순히 널 명령 또는 스눕입니다).

이 매개 변수 확장 ( ${x:=y}“할당)을 의미 YX를 하면 x가 해제 또는 비우, 그리고으로 확장 Y “.

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

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

사용되는 이유 :는 명령의 다른 부분이 평가되는 동안 ( :널 명령과 같이) 실행 되지 않기 때문 입니다. 따라서 ${x:=y}다른 것에 영향을 미치지 않고 기능을 수행합니다. 예를 들어 :시작 부분 이 없으면 y 라는 명령을 실행하려고 시도합니다 .

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

:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

답변

첫 번째 :명령은 “noop”또는 “no operation”이라고합니다. 맨 페이지에서 말했듯이 인수를 평가하는 데 종종 사용됩니다.

두 번째 :는 변수 확장의 한정자입니다 :=. 기술적으로는 그렇습니다 . 말했듯이 값이 없으면 값을 설정합니다.

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

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

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


답변