我似乎很难得到我想要的工作。基本上,我有一系列变量,分配了带引号和\字符的字符串。我想删除引号以将它们嵌入到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
这不起作用(无论是抛出一堆索引还是什么都没有),我很确定我对arg
或eval
或其他bash替换不够了解变量
但基本上我想为另一组具有相同问题的变量执行此操作,其中我删除引号,顺便提一下“\”。
非常感谢任何帮助。
答案 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对数组的建议实际上是更好的方法。)