bash将空数组输出为空字符串

时间:2017-10-24 21:29:10

标签: arrays bash

这已被问过几次,有几个已接受的答案,但是,在我的试验中,没有一个答案似乎有用......我有两个数组,每个数组代表一个命令的参数列表。因此,我想正确引用字符串以与eval一起使用:

bash-4.2> ARRAY0=()
bash-4.2> ARRAY3=("ONE" "TWO WITH SPACE" "THREE")
bash-4.2> echo cmd $opt_arg $(printf "%q " "${ARRAY0[@]}")
cmd ''
bash-4.2> echo cmd $opt_arg $(printf "%q " "${ARRAY3[@]}")
cmd ONE TWO\ WITH\ SPACE THREE
bash# 

可能会填充$opt_arg,也可能不填充''。问题是,在第一种情况下,数组为空,它输出if [[ ${#ARRAY0[@]} ]]作为参数,即使数组为空。这会杀死我的命令,因为它期待零参数。我没有找到一个简洁的解决方案(我可以围绕它做DECLARE @temp TABLE (val varchar(10)) INSERT INTO @temp VALUES ('5'), ('2,3'), ('0,40'), ('99,21'), ('100,25') SELECT val [A] ,CASE WHEN val LIKE '%,%' THEN RIGHT(val, Charindex(',', REVERSE(val)) - 1) ELSE val END [B] ,CASE WHEN val LIKE '%,%' THEN LEFT(val, Charindex(',', val) -1 ) END [C] FROM @temp ,但这相当丑陋......)。有没有一个巧妙的方法来做到这一点?

2 个答案:

答案 0 :(得分:1)

为什么需要printf?只需"${ARRAY0[@]}"即可。

for i in cmd $opt_arg "${ARRAY0[@]}"; do echo "[[[$i]]]"; done
[[[cmd]]]

for i in cmd $opt_arg "${ARRAY3[@]}"; do echo "[[[$i]]]"; done
[[[cmd]]]
[[[ONE]]]
[[[TWO WITH SPACE]]]
[[[THREE]]]

答案 1 :(得分:1)

我使用的习惯是始终检查数组长度:

(( ${#array[@]} )) && printf '%q ' "${array[@]}"

也就是说,在目前的情况下,只需在列表中包含cmd即可避免零参数情况,确保printf始终至少有一个非格式字符串参数:

printf '%q ' cmd "${array[@]}"