나는 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}