首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变量替换删除引号

变量替换删除引号
EN

Stack Overflow用户
提问于 2013-03-28 08:03:46
回答 2查看 1.5K关注 0票数 1

我似乎很难得到我想要的工作。基本上,我有一系列的变量,它们被分配了带有引号和\字符的字符串。我想删除引号以将它们嵌入到json文档中,因为json讨厌使用python dump方法的引号。

我想这会很容易。只需确定如何轻松地删除字符,然后为变量替换编写一个简单的for循环,它不是这样工作的。

这是我想要做的。

有一个名为"MESSAGE23“的变量,它包含下面的"com.centrify.tokend.cac",我想去掉引号,这对我来说很简单,一个简单的echo $opt | sed "s/\"//g"。当我从命令行执行此操作时:

代码语言:javascript
复制
$> MESSAGE23="com."apple".cacng.tokend is present"
$> MESSAGE23=`echo $MESSAGE23 | sed "s/\"//g"`
$> com.apple.cacng.tokend is present

这是可行的。我得到了格式正确的字符串。

然后我试着把它扔进一个循环中,所有的地狱都被打破了。

代码语言:javascript
复制
for i to {1..25}; do
   MESSAGE$i=`echo $MESSAGE$i | sed "s/\"//g"`
done

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

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

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2013-03-28 08:19:05

你不能这么做。您可以使用eval使其工作,但这会引入另一个您必须担心的报价级别。有什么原因你不能使用数组吗?

代码语言:javascript
复制
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

否则,您需要这样的代码:

代码语言:javascript
复制
 eval 'echo "$MESSAGE'"$i"'"'

从那时起,情况只会变得更糟。

票数 3
EN

Stack Overflow用户

发布于 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}')。

代码语言:javascript
复制
for i in {1..25}; do
    varname="MESSAGE$i"
    declare $varname="$(echo "${!varname}" | tr -d '"')"
done

(请注意,我也使用了tr而不是sed,但这只是我个人的偏好。)

(还要注意,@Mark Reed建议的数组确实是做这类事情的更好方法。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15671875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档