2013-03-28 74 views
1

我似乎在获取我想要的工作时遇到了一些困难。基本上,我有一系列变量,它们被分配了带有一些引号和\字符的字符串。我想删除引号将它们嵌入到json文档中,因为json不喜欢使用python转储方法引用引号。变量替换消除引号

我觉得这很容易。只需确定如何轻松删除字符,然后为变量替换编写一个简单的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 

这不工作(无论它抛出了一堆指标出来或没有),我敢肯定,我只是不知道argeval或其他庆典替换变量足够。

但基本上我想为另一组具有相同问题的变量执行此操作,在这里我将引号和附带的“\”去掉。

任何帮助将不胜感激。

回答

3

你不能那样做。您可以使用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"'"' 

,它只是得到的情况更糟糕。

+0

yuck ..不,不反对使用数组?我有变量MESSAGE1-25,我应该把每一个都推到一个数组上,然后弹出每个关闭并替换它?我想我不知道我应该把这个数组放在哪里? – 2013-03-28 00:37:14

+0

哦..我明白了。 MESSAGE是数组并弹出数组到该数组 – 2013-03-28 00:37:58

+0

右。你可以使用'MESSAGE1 = blah1','MESSAGE2 = blah2'等,而不是'MESSAGE1 = blah1','MESSAGE [0] = blah1','MESSAGE [1] = blah2'等等。或者像圆括号一样初始化整个事物,或者使用'read -a'从文件中读取它 - 这取决于这些变量是如何在应用程序中设置的。 – 2013-03-28 14:13:13

1

首先,几个初步问题:MESSAGE23="com."apple".cacng.tokend is present"将不会在变量值中嵌入双引号,请使用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,不过这只是我个人的偏好。)

(另请注意,数组的@马克里德的建议真的是更好的方式来做到这一点那类的东西。)

+0

谢谢你们。从这里学到了很多东西,将尝试使用数组选项和使用声明。谢谢 – 2013-03-29 01:31:49