我需要处理一个bash脚本的参数,该脚本可能有也可能没有前导符号(octothorpe)。最简单的例子是:
echo #1234
不返回任何内容
这可能是因为它将文本作为命令处理并假定它是注释。
$ @,$ *等不起作用。 getopts似乎没有解决这类问题。
欢迎提出建议
答案 0 :(得分:4)
这是完全不可能的,因为有问题的“参数”被解析为注释而从未传递给命令。
请记住,C中的程序对main
函数具有以下调用约定:
int main(int argc, char *argv[])
这意味着程序会传递一个单独的,单独的参数列表,而不是一个尚未解析的字符串。 解析参数向量的原始字符串根本没有提供给被调用的程序;通常情况下,没有“原始字符串”存在。因此,被调用的程序无法“解开铃声”并从解析后的字符串列表返回到生成它的原始字符串。 / p>
因此,如果您的脚本作为外部命令(而不是shell函数)调用,则由操作系统运行它的shell的调用将通过the execve
syscall,其作为其参数( 1)要执行的文件; (2)传递它的参数向量(也就是说,前面提到的各个C字符串列表); (3)环境变量列表。未解析的shell命令行没有参数,因此子进程没有可用的内容。
训练您的用户使用适当的报价。就yourscript
而言,以下所有内容都具有完全无法区分的行为:
yourscript '#1234' # single quotes prevent content from being parsed as shell syntax
yourscript ''#1234 # "#" only begins a comment at the front of a string
yourscript '#'1234 # note that shell quoting is character-by-character
yourscript \#1234 # ...so either quoting or escaping only that single character suffices.
...以上任何内容都会传递argv
包含(使用C语法)char[][]{ "yourscript", "#1234", NULL }