~에서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}}}