2014-09-25 199 views
-1

我有点卡住了这个。我delaring一个变量在我的脚本的顶部,然后我创建一个文件作为我的脚本的一部分:转义bash变量

app="testing" 
cat <<EOF >/etc/init.d/test 
#!/bin/bash 
args="--emperor $APPCONF/test/$APP.ini" 
EOF 

它似乎没有工作,虽然,它似乎在$应用程序变量。我必须对这个变量做些什么来让它显示它的值,在我创建的文件里面“测试”吗?

+0

这与_escaping_变量有什么关系?转义用于防止评估某件事物,而不是强制评估它。 – Barmar 2014-09-25 13:48:25

+1

这是一个新手问题,我还在学习 – Jimmy 2014-09-25 13:49:29

+1

顺便说一句,BashFAQ#50与你在这里写的代码非常相关:http://mywiki.wooledge.org/BashFAQ/050 – 2014-09-25 13:52:09

回答

5

使用一致的情况。变量名称区分大小写。

+0

谢谢你。这是唯一的问题,我看到提到这样做:'''args =“ - emperor $ APPCONF/test/\ $ APP.ini”''' – Jimmy 2014-09-25 13:50:20

+0

只有当你想要'$'从字面上看是在输出中,而不是表明你想要扩展变量。尝试一下。 – dee 2014-09-25 13:52:49

0

除了使用一致的大小写($app不同于$APP)之外,您可能希望将变量名称括在括号内 - 否则,如果在变量值之间使用空格,则可能会出现问题,这是一种很好的做法。例如:

args="--emperor ${APPCONF}/test/${APP}.ini" 

这样,$APPCONF没有得到混淆${APP}CONF也。我希望这有帮助!

+0

在某些情况下,这并没有帮助 - 如果APPCONF具有包含空格的目录名称? – 2014-09-25 13:54:32

+0

我不是100%确定,但不应该被双引号覆盖? [* 3.1。双引号参数(变量)引用和命令替换*](http://www.dwheeler.com/essays/filenames-in-shell.html)...说实话,从来没有真正想过这么多,所以感谢把它带来:) – 2014-09-25 14:07:56

+0

双引号处理分配结束,但不是你实际上试图在某处使用该参数列表的一侧。当你使用它时,你需要强制它在'--emperor'和文件名之间的空格上进行字符串分割;这样做并不会在“APPCONF”扩展中分裂任何空间,这是事情变得棘手的地方。 – 2014-09-25 14:59:32

0

我不确定要理解你的问题。我想,你想用一个文件

/etc/init.d/test 

包含文本结束:

#!/bin/bash 
args="--emperor $APPCONF/test/testing.ini" 

如果这样你的脚本应该是:

app="testing" 
cat <<EOF >/etc/init.d/test 
#!/bin/bash 
args="--emperor \$APPCONF/test/$app.ini" 
EOF 
2

比方说,你在做这个正确的方法。你要存储在数组中的数据:

args=(--emperor "${appconf}/test/${app}.ini") 

,然后将其转换为字符串嵌入:

printf -v args_str '%q ' "${args[@]}"` 

...和使用您的定界符内部的字符串:

#!/bin/bash 
args=($args_str) 
EOF 

...这之外,正在创建的脚本里的任何东西将要扩大它作为一个数组:

run_something "${args[@]}" 

请参阅BashFAQ #50的基本原理和细节。