![在单个字符串中回显时删除空变量名称和值](https://linux22.com/image/196837/%E5%9C%A8%E5%8D%95%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E5%9B%9E%E6%98%BE%E6%97%B6%E5%88%A0%E9%99%A4%E7%A9%BA%E5%8F%98%E9%87%8F%E5%90%8D%E7%A7%B0%E5%92%8C%E5%80%BC.png)
我有以下条件,其中值如下。
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
将变量转换为整数,但它仍然以与字符串相同的方式打印,并且我认为没有简单的方法来确定变量是字符串还是整数。)