输出shell变量时如何保留引号?

时间:2011-08-22 14:16:13

标签: linux shell unix formatting string-formatting

以下一行:

`eval echo echo $VAR=\\$$VAR` >> $FILE

将输出到名为$FILE的文件:

FOO=value_of_full
BAR=value_of_bar

我想输出引号,例如:

FOO="value_of_full"
BAR="value_of_bar"

我已尝试使用\""",但两者都没有按预期工作。

6 个答案:

答案 0 :(得分:4)

你的eval正在吞噬你的报价。

您可以将indirect variable referencing与bash> = 2.0一起使用,以减轻对eval的需求:

echo "${VAR}=\"${!VAR}\"" >> $FILE

不幸的是,不支持双重(或三重...)解除引用,因此您无法执行${!!VAR}${!${!VAR}} - 您仍需诉诸eval那些方法。但在这种情况下,我认为你不需要。

如果你确实想要使用eval,那么你将不得不双重逃脱逃生,如下所示:

eval echo "$VAR=\\\"\$$VAR\\\"" >> $FILE

或者,如果您确实需要额外的执行级别(如上例所示),那么您需要三倍逃避逃脱!

`eval echo echo $VAR=\\\\\"\\$$VAR\\\\\"` >> $FILE

就个人而言,我更喜欢第一种方法: - )

答案 1 :(得分:0)

这样可行,但我不知道如何使用VAR来表示变量的名称和值。

#!/bin/sh
FILE=/tmp/out.txt
VAR1_NAME=foo
VAR1_VALUE=foo_value

echo "$VAR1_NAME=\"$VAR1_VALUE\"" >> $FILE

答案 2 :(得分:0)

诀窍是你需要在单行上保留引号所需的转义次数...如果你使用中间变量将其分开,则会更容易:

#!/bin/sh
FILE=out.txt
VAR=BAR
BAR="value of bar"
eval TMP="\$$VAR"
echo $VAR=\"$TMP\" >> $FILE

out.txt现在将包含:

BAR="value of bar"

请注意,如果BAR有空格,则需要第4行的引号,如果BAR可能有空格,则需要第5行。在第6行获取值所需的\"包装器。

答案 3 :(得分:0)

快速查看KSH - 以下作品。

你正在尝试别的吗?你在做什么外壳?

FILE=myfile
VAR1="some text"
echo "VAR1=\"${VAR1}\"" > $FILE

cat myfile

VAR1="some text"

答案 4 :(得分:0)

在bash中,您可以这样做:

declare -p FOO BAR

可悲的是,我记不起一个简单,便携的方式来获取POSIX sh。

答案 5 :(得分:0)

最好的两种方法(可能仅限bash);

  1. printf "%q=%q" VAR 'some value with special characters'
  2. 魔术别名 (由Simon Tatham 1发明):
  3. echo-literally-helper() {
        str="`history 1 | perl -pe 's/^ *[0-9]+ +[^ ]+ //'`"
        echo "$str"
    }
    alias echo-literally='echo-literally-helper #'
    

    <子> Description and explanation here

    您可以像这样使用 monstrosity

    echo-literally some *highly* risky 'set' of $IMPOSSIBLE unquoted; literals&
    

    除了 ANY 扩展或修改完成后,除了文字文本之外,它将正常输出。诀窍是它

    • 将别名参数转换为尾随注释
    • 它可以使bash历史记录显示为未修改的注释以字符串值

    你不得不佩服这个狡猾的黑客。我相信你会明智地不在严肃的环境中应用它:)

    1 Magic Aliases: A Layering Loophole in the Bourne Shell