이런 종류의 약어가 있는지 궁금합니다.
현재는 할 수 있습니다.
var_empty=; [ -n "$var" ] || var_empty=1; #intermediary variable
echo "REPL_if_var_empty_otherwise_empty=${var_empty:+REPL}"
중개인 없이도 가능한가요?
나는 노력했다
sh -c 'readonly SAME=SAME; var=; echo test0=${var:-SAME} test1=${SAME:+REPL}; echo REPL_if_var_empty_otherwise_empty=${${var:-SAME}:+REPL}'
그러나 이로 인해 bad substitution
마지막 echo
( test0=SAME test1=REPL
)에 오류가 발생합니다. 왜 그런 겁니까? 다른 방법이 있나요?
답변1
bash, ksh 또는 emulation zsh
에서는 ksh
다음을 수행할 수 있습니다.
r=empty;output=${r[${#var}]}
존재하다 zsh
:
output=${${var:-empty$var}%$var}
그렇지 않으면 언제든지 할 수 있습니다
output=;[ "$var" ]||output=empty
답변2
"중개자 없음"이 무슨 뜻인지 잘 모르겠습니다. "한 줄에 모두 수행" 또는 "변수 할당도 수행하지 않고 모든 작업을 직접 수행"을 의미하는 경우 각 방법에 대한 설명은 다음과 같습니다.
방법 1a - 변수 할당 사용:
$ testVar=; [[ "${testVar}" ]] && testVar="" || testVar="was empty"; echo $testVar
방법 1b - 변수 할당 사용:
testVar=; testVar=$( [ $testVar ] || echo "was empty"); echo $testVar
방법 2 - 할당 없음:
$ testVar=; [[ "${testVar}" ]] && echo "" || echo "was empty"
산출:
was empty
보너스:
일반화 - 필요한 부분을 선택하세요. 변수가 전혀 없습니다.
echo testValue | { echo -n "Original value: "; tee >(read -n 1 && echo "wasn't empty" || echo "was empty"); }
echo testValue
변수를 할당하는 데 사용할 원래 명령으로 바꾸 십시오.
일반화 - awk 사용:
echo -n | awk 'BEGIN{print "Original value: "}; d=1; END{if (!d) {print "was empty"} else {print "was not empty"} }'
다시 한 번 필요한 사례를 선택하세요(OP 질문의 경우 원시 값은 필요하지 않지만 아마도 덜 일반적인 사용 사례일 것입니다). 변수로 시작해야 한다면 echo
변수로 시작하세요. 결과를 변수에 할당해야 하는 경우 명령 대체를 사용하세요(모든 것을 $( ... )
.
참고: 내가 아는 한, sed
이는 100% 행 중심이고 "빈 케이스"는 정의에 따라 행이 0이므로 이러한 경우에는 도움이 되지 않습니다. 따라서 sed
사용자가 말하는 내용을 처리하기 전에 종료됩니다. 또한 저는 Perl에 대해 잘 알지 못해서 그것을 알아낼 수 없었습니다. Perl을 잘하는 사람이라면 알 수 있을 것 같지만요. Bash는 {var:=param}
다음과 같이 작동합니다. OP의 경우 특별히 도움이 되지는 않지만 완전성을 위해 언급하겠습니다. OP와 같은 이유로 명명된 문자열 변수뿐만 아니라 원시 문자열에서 작동하기를 원합니다(나중에 필요하지 않으면 중간체를 피하고 싶습니다).