Z-Shell의 사용자 안내서 에서 다음을 읽었습니다 .
‘true’의 동의어는 ‘:’입니다. 부작용이 있지만 사용해서는 안되는 인수를 제공하기 위해 종종이 형식으로 사용됩니다.
: ${param:=value}
이는 모든 Bourne 쉘 파생 상품의 공통 관용구입니다. 매개 변수 확장에서
$param
값이 이전에 비어 있으면 값을 제공하고 그렇지 않으면 그대로 둡니다. 이것이 매개 변수 확장의 유일한 이유이므로:
인수를 무시하는 데 사용 합니다. 실제로, 쉘은 명령 행 (콜론과 그 뒤에 값이 무엇이든간에$param
할당이 발생했는지 여부와 상관없이)을 명령 적으로 빌드 한 다음 명령을 실행합니다. ‘:’은 주어진 인수에 대해 아무런 통지도하지 않습니다.
그러나 나는 그것을 이해하지 못한다. 나는 그 :
의미를 얻지 true
만 표현에는 두 개의 콜론이 있습니다. 사소한 질문으로,이 관용구가 모든 Bourne 쉘 파생물에서 왜 그렇게 많이 사용됩니까? 어떤 목적으로 사용됩니까?
참고 :
이 관용구가 bash 및 zsh 에서 수행하는 작업에 관심이 있습니다.
감사
답변
이것을 조각으로 나누자.
이 코드는 :
몇 가지 인수로 명령 을 실행합니다 . 이 명령 :
은 아무것도하지 않으며 인수를 무시합니다. 따라서 인수에서 발생하는 부작용을 제외하고 전체 명령 행은 아무 것도 수행하지 않습니다.
이 구문 ${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}
“할당)을 의미 Y 에 X를 하면 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이 변경 될 때까지).