无法将“#”字符作为命令行参数传递

36

我无法将以#开头的字符串作为命令行参数传递。

这里有一个简单的测试:

#include <stdio.h>

int main(int argc, char *argv[])
{
    for (int i = 1; i < argc; i++)
        printf("%s ", argv[i]);

    putchar('\n');

    return 0;
}

如果我将参数输入如下:

2 4 # 5 6

argc 的值为 3 而非 6。它读取了 # 并停止了。我不知道原因,也在我的《C程序设计语言》和《C Primer Plus》的副本中找不到答案。


44
在StackOverflow上的语法高亮很好地展示了您的问题 :) - Brad Allred
3个回答

47

# 在 Unix shell 中开始注释,类似于 C 中的 //

这意味着当shell将参数传递给程序时,它会忽略#后面的所有内容。使用反斜杠或引号进行转义将意味着它被视为其他参数并且程序应该按预期工作。

2 4 \# 5 6
或者
2 4 '#' 5 6
或者
2 4 "#" 5 6

请注意,# 只有在单词的开头才是注释字符,因此这个也应该可以工作:

2 4#5 6

2
这似乎是一个相当不错的列表 https://unix.stackexchange.com/a/270979 - fanduin
22
@cd-00 你需要学习如何使用shell。这与你的C代码无关。 - chepner
3
啊,所以你可以在交互式的Shell会话中输入注释,这样Shell就可以忽略它,而你在输入完毕后立即看到这个注释。真是一个非常有用的功能。 - Joker_vD
6
当你将shell视为命令行界面时,它实际上是一个脚本解释器。能够像交互式CLI一样使用它只是一个不错的额外功能。当你“运行脚本”与交互式输入命令时,为什么解释行为会有显著不同之处呢?echo echo Hello, World | bash 或者 bash <<END 是否属于交互式? - Christopher Schultz
6
@Joker_vD:我经常在交互式会话中键入注释,以便在shell历史记录中进行参考。有时这是为了记录提交哈希或其他通过stdout发出的ID;有时它是为了提醒未来的自己某个命令失败;有时它是为了记录临时基准测试的时间数据。这确实是一个有用的功能。 - wchargin
显示剩余3条评论

12

在通过命令行参数传递值时,您必须遵循以下指示。 以下字符在某些上下文中对Shell本身具有特殊含义,并且可能需要转义为参数:

` Backtick (U+0060 Grave Accent)
~ Tilde (U+007E)
! Exclamation mark (U+0021)
# Hash (U+0023 Number Sign)
$ Dollar sign (U+0024)
& Ampersand (U+0026)
* Asterisk (U+002A)
( Left Parenthesis (U+0028)
) Right parenthesis (U+0029)
 (⇥) Tab (U+0009)
{ Left brace (U+007B Left Curly Bracket)
[ Left square bracket (U+005B)
| Vertical bar (U+007C Vertical Line)
\ Backslash (U+005C Reverse Solidus)
; Semicolon (U+003B)
' Single quote / Apostrophe (U+0027)
" Double quote (U+0022)
↩ New line (U+000A)
< Less than (U+003C)
> Greater than (U+003E)
? Question mark (U+003F)
  Space (U+0020)1

3
那么它们应该如何转义? - ilkkachu
3
通过使用反斜杠进行转义。例如:2 4 \{#,$,&,*} 5 6 - VJAYSLN

8

因为您正在使用类似于sh的Shell。请对#进行引用或使用\进行转义,那么它将能够正常工作。

这在sh中被称为注释。它会导致#(空格-井号)以及其后面的任何参数被丢弃。它的用法类似于C语言中的注释,用于代码文档化。

$开头的字符串在sh中被称为变量。如果您没有设置一个变量,它将扩展为空字符串。

例如,以下所有方式都是将#传递给应用程序的有效方法:

2 4 '#' 5 6
2 4 "#" 5 6
2 4 \# 5 6

以下是可以传递以$开头的字符串的有效方法:

2 4 '$var' 5 6
2 4 '$'var 5 6
2 4 \$var 5 6

请注意,"包含的变量仍会被扩展。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接