我有点卡住了这个。我delaring一个变量在我的脚本的顶部,然后我创建一个文件作为我的脚本的一部分:转义bash变量
app="testing"
cat <<EOF >/etc/init.d/test
#!/bin/bash
args="--emperor $APPCONF/test/$APP.ini"
EOF
它似乎没有工作,虽然,它似乎在$应用程序变量。我必须对这个变量做些什么来让它显示它的值,在我创建的文件里面“测试”吗?
我有点卡住了这个。我delaring一个变量在我的脚本的顶部,然后我创建一个文件作为我的脚本的一部分:转义bash变量
app="testing"
cat <<EOF >/etc/init.d/test
#!/bin/bash
args="--emperor $APPCONF/test/$APP.ini"
EOF
它似乎没有工作,虽然,它似乎在$应用程序变量。我必须对这个变量做些什么来让它显示它的值,在我创建的文件里面“测试”吗?
除了使用一致的大小写($app
不同于$APP
)之外,您可能希望将变量名称括在括号内 - 否则,如果在变量值之间使用空格,则可能会出现问题,这是一种很好的做法。例如:
args="--emperor ${APPCONF}/test/${APP}.ini"
这样,$APPCONF
没有得到混淆${APP}CONF
也。我希望这有帮助!
在某些情况下,这并没有帮助 - 如果APPCONF具有包含空格的目录名称? – 2014-09-25 13:54:32
我不是100%确定,但不应该被双引号覆盖? [* 3.1。双引号参数(变量)引用和命令替换*](http://www.dwheeler.com/essays/filenames-in-shell.html)...说实话,从来没有真正想过这么多,所以感谢把它带来:) – 2014-09-25 14:07:56
双引号处理分配结束,但不是你实际上试图在某处使用该参数列表的一侧。当你使用它时,你需要强制它在'--emperor'和文件名之间的空格上进行字符串分割;这样做并不会在“APPCONF”扩展中分裂任何空间,这是事情变得棘手的地方。 – 2014-09-25 14:59:32
我不确定要理解你的问题。我想,你想用一个文件
/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
比方说,你在做这个正确的方法。你要存储在数组中的数据:
args=(--emperor "${appconf}/test/${app}.ini")
,然后将其转换为字符串嵌入:
printf -v args_str '%q ' "${args[@]}"`
...和使用您的定界符内部的字符串:
#!/bin/bash
args=($args_str)
EOF
...这之外,正在创建的脚本里的任何东西将要扩大它作为一个数组:
run_something "${args[@]}"
请参阅BashFAQ #50的基本原理和细节。
这与_escaping_变量有什么关系?转义用于防止评估某件事物,而不是强制评估它。 – Barmar 2014-09-25 13:48:25
这是一个新手问题,我还在学习 – Jimmy 2014-09-25 13:49:29
顺便说一句,BashFAQ#50与你在这里写的代码非常相关:http://mywiki.wooledge.org/BashFAQ/050 – 2014-09-25 13:52:09