我似乎很难得到我想要的工作。基本上,我有一系列的变量,它们被分配了带有引号和\字符的字符串。我想删除引号以将它们嵌入到json文档中,因为json讨厌使用python dump方法的引号。
我想这会很容易。只需确定如何轻松地删除字符,然后为变量替换编写一个简单的for循环,它不是这样工作的。
这是我想要做的。
有一个名为"MESSAGE23“的变量,它包含下面的"com.centrify.tokend.cac",我想去掉引号,这对我来说很简单,一个简单的echo $opt | sed "s/\"//g"。当我从命令行执行此操作时:
$> MESSAGE23="com."apple".cacng.tokend is present"
$> MESSAGE23=`echo $MESSAGE23 | sed "s/\"//g"`
$> com.apple.cacng.tokend is present这是可行的。我得到了格式正确的字符串。
然后我试着把它扔进一个循环中,所有的地狱都被打破了。
for i to {1..25}; do
MESSAGE$i=`echo $MESSAGE$i | sed "s/\"//g"`
done这不起作用(要么抛出一堆索引,要么什么也不抛出),而且我很确定我对arg或eval或其他bash替代变量了解不够。
但基本上,我想对另一组具有相同问题的变量执行此操作,其中我去掉了引号和"\“。
任何帮助都将不胜感激。
发布于 2013-03-28 08:19:05
你不能这么做。您可以使用eval使其工作,但这会引入另一个您必须担心的报价级别。有什么原因你不能使用数组吗?
MESSAGE=("this is MESSAGE[0]" "this is MESSAGE[1]")
MESSAGE[2]="I can add more, too!"
for (( i=0; i<${#MESSAGE[@]}; ++i )); do
echo "${MESSAGE[i]}"
done否则,您需要这样的代码:
eval 'echo "$MESSAGE'"$i"'"'从那时起,情况只会变得更糟。
发布于 2013-03-28 08:48:44
首先,有几个初步的问题:MESSAGE23="com."apple".cacng.tokend is present"不会在变量value中嵌入双引号,而是使用MESSAGE23="com.\"apple\".cacng.tokend is present"或MESSAGE23='com."apple".cacng.tokend is present'。其次,您几乎总是应该用双引号将变量扩展(例如echo "$MESSAGE23")括起来,以防止解析出现奇怪的情况。
现在,真正的问题是: shell不允许在赋值的左侧进行变量替换(即MESSAGE$i=something不起作用)。幸运的是,它允许在declare语句中这样做,所以您可以使用它。此外,当看到$MESSAGE$i时,它将替换$MESSAGE的值,后跟$i的值;为此,您需要使用间接扩展(`${!metavariable}')。
for i in {1..25}; do
varname="MESSAGE$i"
declare $varname="$(echo "${!varname}" | tr -d '"')"
done(请注意,我也使用了tr而不是sed,但这只是我个人的偏好。)
(还要注意,@Mark Reed建议的数组确实是做这类事情的更好方法。)
https://stackoverflow.com/questions/15671875
复制相似问题