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


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

argcis 3和not 的值6。它会#在此处读取并停止。我不知道为什么,在C语言C Primer Plus的副本中也找不到答案。


44
StackOverflow上突出显示的语法很好地说明了您的问题:)
Brad Allred

Answers:


47

# 在Unix shell中开始评论,就像 //在C中。

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

2 4 \# 5 6

要么

2 4 '#' 5 6

要么

2 4 "#" 5 6

请注意,#仅在单词的开头添加才是注释字符,因此这也可以使用:

2 4#5 6

2
这似乎是一个很好的列表unix.stackexchange.com/a/270979
fanduin

22
@ cd-00您需要学习shell的工作方式。这与您的C代码无关。
chepner

3
嗯,所以您可以在交互式 shell会话中键入注释,以便shell在键入完之后可以立即忽略它。多么有用的功能。
Joker_vD

6
@Joker_vD当您将shell视为命令行界面时,它实际上是一个脚本解释器。您可以像交互式CLI一样使用它,这是一个很好的好处。为什么当您“运行脚本”与以交互方式键入命令时,解释器的行为有显着不同?那呢echo echo Hello, World | bash?互动吗?也许bash <<END呢?
克里斯托弗·舒尔茨

6
@Joker_vD:我经常在交互式会话中键入注释,以在我的shell历史记录中进行引用。有时这是为了记录提交到stdout的提交哈希或其他ID;有时要注意,命令失败是对我未来自我的记录;有时是记录时序数据以进行临时基准测试。这一个有用的功能。
wchargin

12

通过命令行参数传递值时,必须遵循以下说明。在某些情况下,以下字符对外壳本身具有特殊含义,可能需要在参数中转义:

` 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
\-通过使用反斜杠.EX进行转义:2 4 \{#,$,&,*} 5 6
VJAYSLN

8

这是因为您正在使用 sh类似Shell的外壳。引用#或使用进行转义\,它将起作用。

这称为评论sh。它导致#(space-hash)及其后的所有参数都被丢弃。它与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

请注意,"s 内部的变量仍在扩展。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.