매개변수 확장에 기본값과 alt_value를 사용하면 매개변수 값이 삭제되나요?

매개변수 확장에 기본값과 alt_value를 사용하면 매개변수 값이 삭제되나요?

나는 Bash로 제한되어 있습니다.
매개변수 설정 여부에 따라 두 문자열 중 하나를 에코하고 싶습니다.
예를 들어

if $ARG is notset|empty then print X
if $ARG is set&nonempty then print V

나는 $ARG 콘텐츠에 전혀 관심이 없습니다. 제공 및 기입 여부.

IF/CASE/etc를 통해 이 결과를 얻을 수 있다는 것을 알고 있습니다. 하지만 저는 이 구조를 여러 번 사용할 것이므로 단순하게 유지하고 싶습니다. 어떤 방식으로든 이 작업을 수행하고 함수로 래핑할 수 있다는 것을 알고 있지만 스마트한 방법(예: 매개변수 확장)으로 만들 수 있는지 궁금합니다.

나는 다 읽었다https://tldp.org/LDP/abs/html/parameter-substitution.html그리고 일부 유사한 페이지에서 유사하고 보완적인 것처럼 보이는 두 가지 작업을 발견했습니다.

default value:      ${ARG:-X}
alternative value:  ${ARG:+V}

그건 그렇고, 이것이 질문의 제목에서 나온 것입니다. :-비어 있으면 X를 반환하고 :+비어 있지 않으면 V를 반환합니다.

간단한:

echo ${ARG:+V}${ARG:-X}

하다거의내가 원하는 것은. 비어 있거나 설정되지 않은 X경우 $ARG인쇄하지만 ARG=foo와 같은 다른 경우에는 Vfoo. 그 :+이유 는 :-내가 원하는 방식으로 실제로 보완적이지 않기 때문입니다.) 간단한 연결처럼 작동하게 하려면 비어 있을 때 "기본값"을 출력하거나 아무것도 출력하지 않는(:tested 변수 아님) " ${}${}역"이 필요합니다 .:+

이 작업을 한 번에 수행하고 인수 상태에 따라 주어진 두 값 중에서 선택하고 실제로는 사용하지 않는 이와 같은 괴물 복합 명령이 필요한 것 같습니다 ( alt_value 와 함께 사용 ${ARG:+V:-X}되기 때문에 작동하지 않습니다 ). 매개변수가 보유하는 실제 텍스트입니다.:+V:-X

순진하게 중첩을 시도했는데

echo ${${ARG:+V}:-X}

이것이 바로 나에게 필요한 것이지만 Bash에서는 작동하지 않습니다.범위확장되고 내부가 ${ARG:+V}매개변수가 아니므로 외부가 ${}불평합니다. (~명령 대체가 변수 대체 내에 중첩될 수 있습니까?)

Vfoo나는 그것을 첫 번째 문자로 줄여서 문제를 해결하려고 시도할 수 있다고 생각합니다. ${xxx:0:1}그러나 그렇게 하려면 다시 중첩이 필요하므로 ${${ARG:+V}${ARG:-X}:0:1}절대 불가능합니다.

또는 도우미 변수인 경우에는 괜찮습니다.

MINGW64 ~
$ f () { T=${1:+V}${1:-X} ; echo ${T:0:1} ; } ;

$ f "a"
V

$ f ""
X

$ f
X

이것은 내가 원하는 동작을 가질 수 있는 가장 가까운 것입니다. 실제로 첫 번째 문자를 얻기 위해
임의로 긴 문자열을 구성하기 때문에 약간 더러운 느낌이 듭니다 . T순수 폐기물.
또한 임시 변수가 필요 없이 이를 표현식으로 압축하고 싶습니다 T.

Bash에서 뭔가를 놓쳤나요? 매개변수 확장이나 기타 내장된 트릭을 통해 더 나은 방법으로 이 "선택" 동작을 얻을 수 있습니까?

답변1

다음을 수행할 수 있습니다.

either=(
  'value for unset or empty'
  'value for set and non-empty'
)
printf '%s\n' "${either[!!${#VAR}]}"

set +o histexpand(대화형 bash를 통해 호출하려는 경우 기록 확장( )을 비활성화합니다.)

${#VAR}값의 문자 수로 확장되는 것은 $VAR변수 가 비어 있거나 설정되지 않은 경우 산술 표현식이 0을 생성하고 그렇지 않으면 1을 생성하므로 !!이중 부정입니다 .!!${#VAR}

를 사용하면 zsh다음을 수행할 수 있습니다.

print -r -- ${${var:+value for set and non-empty}:-value for unset or empty}

관련 정보