这已被问过几次,有几个已接受的答案,但是,在我的试验中,没有一个答案似乎有用......我有两个数组,每个数组代表一个命令的参数列表。因此,我想正确引用字符串以与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
,但这相当丑陋......)。有没有一个巧妙的方法来做到这一点?
答案 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[@]}"