第一个问题:
假设我们编写一个简单的程序,这需要在命令行参数,并打印到文件中。 如果用户输入
将writeToFile您好!0 \ NW%ORL \ t!@#y的
庆典与回复
!0:未找到事件。
如果没有用户不知道的东西喜欢用引号(“”)或转义字符(“\”),我怎么处理这个东西,而不是bash的理解它是一个命令?
第二个问题:
一旦我得到这些论点,我该如何将其解释为特殊字符,而不是字符序列。 (即\ t是选项卡,而不是 '\' 'T')
也就是说,如何确保程序写这文件:
Hello!0
w%orl !@#y
并不是
Hello!0\n w%orl\t!@#y
关于第二个问题:作为@Jims说,你可以用printf(1)打印字符串。 好主意,但要知道,这仅仅是因为你逃脱(似乎)会工作要认识到,像\t
和\n
,是相同的printf认识的人。
这些逃逸是常见的,但没有什么关于他们的根本,所以一般回答你的问题-和答案,如果你想认识一个逃脱的printf不-是你的程序对其进行解释。 在类似C的代码来做到这一点会是这样的:
char *arg = "foo\\tbar\\n"; /* the doubled backslashes are to make this valid C */
int arglen = strlen(arg);
for (i=0; i<arglen; i++) {
if (arg[i] == '\\') { // we've spotted an escape
// interpret a backslash escape
i++; // we should check for EOS here...
switch (arg[i]) {
case 'n': putchar('\n'); break;
case 't': putchar('\t'); break;
// etc
}
} else {
// ordinary character: just output it
putchar(arg[i]);
}
}
(插入错误处理和良好的作风,去味)。
你不能得到的bash停止解析命令行的命令行。 你的具体情况, set +H
将禁用历史扩展,从而使!0为文字,但如果你提供一个命令仍然失败(parenthesis)
, $variables
, #comments
, ampersand &
壳语法等十多种元素。
请注意,这仅适用于外壳的解析过程,而不是被逐字地传递到任何数据execve
或相似。
无论是让用户引用的数据( 'single quotes'
是会照顾的,除了其他单引号),或使你的程序读取数据本身,这样的互动去
$ writetofile Please enter your gibberish and press enter: Hello!0\nw%orl\t!@#y Thank you for your eloquent contribution. $
第一个问题:使用单引号。 即:将writeToFile '您好!0 \ NW%ORL \ t @#Y'
问题二:用printf。