在单个字符串中回显时删除空变量名称和值

在单个字符串中回显时删除空变量名称和值

我有以下条件,其中值如下。

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. shell 中的字符串变量和数字变量之间通常没有区别,如果您想要在值周围加上引号或类似内容,则必须执行其他操作。在 Bash 中,您可以使用printf %q, 或${var@Q}来获取适合 shell 输入的格式的值,即所有嵌入的引号也正确转义。

您还可以在那里使用关联数组而不是一堆自变量。

(Bash 必须declare -i将变量转换为整数,但它仍然以与字符串相同的方式打印,并且我认为没有简单的方法来确定变量是字符串还是整数。)

相关内容