以下一行:
`eval echo echo $VAR=\\$$VAR` >> $FILE
将输出到名为$FILE
的文件:
FOO=value_of_full
BAR=value_of_bar
我想输出引号,例如:
FOO="value_of_full"
BAR="value_of_bar"
我已尝试使用\"
和""
,但两者都没有按预期工作。
答案 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)
printf
"%q=%q" VAR 'some value with special characters'
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 扩展或修改完成后,除了文字文本之外,它将正常输出。诀窍是它
你不得不佩服这个狡猾的黑客。我相信你会明智地不在严肃的环境中应用它:)