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

这不起作用(要么抛出一堆索引,要么什么都没有),而且我很确定我对argoreval或其他 bash 替换变量了解不够。

但基本上我想对另一组具有相同问题的变量执行此操作,其中我去掉了引号,顺便也去掉了“\”。

任何帮助将不胜感激。

4

2 回答 2

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"'"'

从那里开始变得更糟。

于 2013-03-28T00:19:04.597 回答
1

首先,有几个初步问题:MESSAGE23="com."apple".cacng.tokend is present" 不会在变量值中嵌入双引号,使用MESSAGE23="com.\"apple\".cacng.tokend is present"orMESSAGE23='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 对数组的建议确实是做这种事情的更好方法。)

于 2013-03-28T00:48:43.783 回答