非常简单的问题,但我正在努力弄清楚如何做到这一点。我有一个生成文件,在生成文件中我有以下行:
echo "java packet.Program $1 $2 $3 $4" > programScript
我的问题是:如何使此行准确地打印引号中的内容?现在,它一直试图将 1、2、3、4 美元解释为参数。我希望生成文件在运行时完全回显"java 数据包"。程序 $1 $2 $3 $4" 字符。"$"给了我一个问题。
谢谢。
编辑:
澄清问题。当我输入"回显'java数据包。程序 $1 $2 $3 $4'> programScript"到终端中,它会准确地打印它应该的样子。但是当我将同一行放入我的makefile文件中并运行"make"时,它不会在"java数据包"之后打印任何内容。程序"。
make
不会尝试解析命令行,因此make
对"$name"
和'$name'
的处理方式相同;在这两种情况下,$name
都将替换为make
变量$(name)
的值。在这两种情况下,外壳都不会看到$
。
如果要在生成文件的命令中插入文字$
,则需要编写$$
。
因此,例如:
show_a_dollar:
echo '$$a'
show_a_variable:
echo "$$a"
在第一个make
规则中,生成的操作为:
echo '$a'
从字面上看,这将呼应$a
.在第二个中,生成的操作是
echo "$a"
这将回显环境变量 a
的值。
因此,您需要同时考虑make
扩展规则(要求您将$
加倍以$$
)和 shell 扩展规则(要求命令行参数在单引号内):
echo 'java packet.Program $$1 $$2 $$3 $$4' > programScript
使用任一单引号
echo 'java packet.Program $1 $2 $3 $4' > programScript
或者,转义它们:
echo "java packet.Program $1 $2 $3 $4" > programScript
使用 $$
在 Makefile 中回显 $。参考:在生成文件中转义