如何使用前导磅符号(octothorpe)获取bash参数

时间:2017-12-14 21:14:02

标签: bash parameters arguments

我需要处理一个bash脚本的参数,该脚本可能有也可能没有前导符号(octothorpe)。最简单的例子是:

echo #1234

不返回任何内容

这可能是因为它将文本作为命令处理并假定它是注释。

$ @,$ *等不起作用。 getopts似乎没有解决这类问题。

欢迎提出建议

1 个答案:

答案 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 }