zsh에서 ${name:-word}의 이름이 비어 있는 것을 허용하는 이유는 무엇입니까?

zsh에서 ${name:-word}의 이름이 비어 있는 것을 허용하는 이유는 무엇입니까?

~에서zsh 문서:

${이름-단어}

${이름:-단어}

이름이 설정되었거나 두 번째 형식에서 비어 있지 않으면 해당 값이 대체되고, 그렇지 않으면 단어가 대체됩니다. 두 번째 형식에서는 이름을 생략할 수 있으며, 이 경우 항상 단어로 대체됩니다.

그래서 다음과 같은 것을 사용할 수 있습니다.

$ printf '%s\n' ${:-123}
123

zsh이것이 허용되는 이유와 어떤 상황에서 유용한지 알고 싶습니다 .

답변1

설명이 없어요이 작업을 수행하지만 ${:-foo...}응용 프로그램이 있습니다. 구문상 필요한 경우 매개변수 대체로 간주되지만 항상 사용자가 제공하는 리터럴로 확장됩니다. 이와 같은 것을 작성하여 사용할 수 있습니다확장 플래그또는기타 확장 지정자내부 리터럴 문자열에서:

$ echo ${(#)${=${:-65 66 67}}}
A B C
$ echo ${(q)${:-hello world!}}
hello\ world\!

당신은 또한 수word문자열에 다른 확장자 사용:

$ restofarglist=arg3,arg4
$ echo ${${:-arg1,arg2,$restofarglist}//,/ }

이러한 모든 작업은 올바르게 기록됩니다.매개변수 확장 섹션 끝에서:

${...}대신 유형 매개변수 표현식을 사용하거나 $(...)유형 명령 대체를 사용하는 경우이름위에서는 먼저 확장하고 그 결과를 마치 확장한 것처럼 사용합니다.이름.

이러한 확장은 원하는 만큼 깊게 중첩할 수 있지만 금방 이해하기 어려워질 수 있습니다. ${name=word}양쪽에서 대가족을 사용하면 이상한 경우가 발생할 수 있습니다.

일반적으로 이것은 작업을 수행하는 다소 둔감한 방법이지만, 내가 아는 유일한 응용 프로그램이자 ${:-}다른 변수를 생성하지 않고 이러한 작업을 수행할 수 있는 유일한 방법입니다. 기술적으로 모든 것이 이미 존재하지만 문서는 확실히 더 명확할 수 있습니다.

답변2

매개변수 확장의 다른 기능과 결합하면 몇 가지 깔끔한 트릭을 수행할 수 있습니다.

몇 가지 예:

# strftime date via prompt sequences
tar -cpf ${(%):-%D{%Y%m%d}}-/etc.tar /etc
# brace expansion, but separated by commas via PE flags and nesting PEs.
print ${(j:,:)${:-{1..10}}}

관련 정보