다음 값을 가진 다음 조건이 있습니다.
emp_name="Sid"
emp_id=1234
emp_hobby=""
emp_likes="swimming"
emp_dislikes=""
emp_summary="emp_name:$emp_name,emp_id:$emp_id,emp_hobby:$emp_hobby,emp_likes:$emp_likes,emp_dislikes:$emp_dislikes"
예를 들어 위에 제공된 값을 에코하면 결과가 표시됩니다.
"emp_name:"Sid",emp_id:1234,emp_hobby:,empf_likes:"swimming",emp_dislikes:"
동적 코드에 대한 도움이 필요합니다. 값이 비어 있으면 아래와 같이 전체 변수가 에코에서 제거됩니다.
"emp_name:"Sid",emp_id:1234,emp_likes:"swimming"
{parameter:+word} 반환 값을 시도했지만 변수 이름 자체를 어떻게 해야 할지 잘 모르겠습니다.
답변1
확장 기능을 사용 ${parameter:+word}
하고 정적 부분(변수 이름)도 오른쪽에 배치할 수 있습니다.
$ emp_name=""; echo "-${emp_name:+emp_name:$emp_name}-"
--
$ emp_name="foo bar"; echo "-${emp_name:+emp_name:$emp_name}-"
-emp_name:foo bar-
질문에 표시하는 방식에는 쉼표라는 추가적인 문제가 있습니다. 를 사용할 수 있지만 "${emp_name:+emp_name:$emp_name}"
모든 변수에 대해 이 작업을 수행하면 줄 끝에 쉼표가 표시됩니다. ${str%,}
문자열을 변수에 먼저 저장 하면 삭제할 수 있습니다.str
하지만 모든 변수에 대해 이 작업을 수행하는 것은 약간 반복적입니다. Bash를 사용하는 경우 namerefs를 사용하여 변수를 가리키고 텍스트를 문자열 변수로 수집할 수 있습니다.
str=()
for varname in emp_name emp_id emp_hobby emp_likes emp_dislikes; do
declare -n var=$varname
if [[ -n "$var" ]]; then
str+="$varname:$var,"
fi
done
str=${str%,}
printf "%s\n" "$str"
값에 따라 이를 인쇄하십시오 emp_name:Sid,emp_id:1234,emp_likes:swimming
. 일반적으로 셸의 문자열 변수와 숫자 변수 사이에는 차이가 없습니다. 값 주위에 따옴표를 붙이려면 다른 작업을 수행해야 합니다. Bash에서는 printf %q
또는 를 사용하여 ${var@Q}
쉘 입력에 적합한 형식으로 값을 얻을 수 있습니다. 즉, 포함된 모든 따옴표도 올바르게 이스케이프됩니다.
여러 개의 독립 변수 대신 연관 배열을 사용할 수도 있습니다.
(Bash는 변수를 정수로 변환해야 declare -i
하지만 여전히 문자열과 동일한 방식으로 인쇄하며 변수가 문자열인지 정수인지 확인하는 쉬운 방법은 없다고 생각합니다.)