【问题标题】:variable substitution removing quotes变量替换删除引号
【发布时间】:2013-03-18 07:16:10
【问题描述】:

我似乎很难得到我想要的工作。基本上,我有一系列变量,这些变量分配有一些引号和 \ 字符的字符串。我想删除引号以将它们嵌入到 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 或其他 bash 替换变量了解不够。

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

任何帮助将不胜感激。

【问题讨论】:

    标签: bash loops variable-substitution


    【解决方案1】:

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

    从那里开始变得更糟。

    【讨论】:

    • 呸..不,不反对使用数组?我有变量 MESSAGE1-25,我应该将它们中的每一个推到一个数组上,然后将它们弹出并替换它吗?我想我不确定我应该把这个数组放在哪里?
    • 哦..我明白了。 MESSAGE 是数组并将值弹出到该数组中
    • 对。您可以使用MESSAGE[0]=blah1MESSAGE[1]=blah2 等代替MESSAGE1=blah1MESSAGE2=blah2 等。或者像我一样用括号初始化整个内容,或者使用read -a 从文件中读取它——它只是取决于这些变量是如何在您的应用程序中设置的。
    【解决方案2】:

    首先,几个初步问题: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,但这只是我个人的喜好。)

    (另外,请注意@Mark Reed 对数组的建议确实是做这种事情的更好方法。)

    【讨论】:

    • 谢谢大家.. 在这里从你们俩那里学到了很多东西,将尝试使用数组选项和使用声明。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-03
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多