变量替换删除引号

时间:2013-03-28 00:03:46

标签: bash loops variable-subsitution

我似乎很难得到我想要的工作。基本上,我有一系列变量,分配了带引号和\字符的字符串。我想删除引号以将它们嵌入到json doc中,因为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

这不起作用(无论是抛出一堆索引还是什么都没有),我很确定我对argeval或其他bash替换不够了解变量

但基本上我想为另一组具有相同问题的变量执行此操作,其中我删除引号,顺便提一下“\”。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分: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"'"'

它从那里变得更糟。

答案 1 :(得分: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}&#39;)。

for i in {1..25}; do
    varname="MESSAGE$i"
    declare $varname="$(echo "${!varname}" | tr -d '"')"
done

(请注意,我还使用tr代替sed,但这只是我个人的偏好。)

(另外,请注意@Mark Reed对数组的建议实际上是更好的方法。)