문자열 교체: 비어 있으면 교체하고, 그렇지 않으면 비어 있습니다.

문자열 교체: 비어 있으면 교체하고, 그렇지 않으면 비어 있습니다.

이런 종류의 약어가 있는지 궁금합니다.

현재는 할 수 있습니다.

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와 같은 이유로 명명된 문자열 변수뿐만 아니라 원시 문자열에서 작동하기를 원합니다(나중에 필요하지 않으면 중간체를 피하고 싶습니다).

관련 정보