无法将“#”字符作为命令行参数传递
Unable to pass '#' character as a command-line argument
我无法将以 #
开头的字符串作为命令行参数传递。
这是一个简单的测试:
#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
。它读取 #
并停在那里。我不知道为什么,在我的 The C Programming Language 和 C Primer Plus.
这是因为您正在使用类似 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 中的变量仍然被展开。
#
在 Unix shells 中开始注释,很像 C 中的 //
。
这意味着当 shell 将参数传递给程序时,它会忽略# 后面的所有内容。用反斜杠或引号将其转义意味着它会像其他参数一样处理,程序应该按预期工作。
2 4 \# 5 6
或
2 4 '#' 5 6
或
2 4 "#" 5 6
请注意,#
是仅在单词开头的注释字符,因此这也应该有效:
2 4#5 6
通过命令行参数传递值时,您必须按照以下说明进行操作。
以下字符在某些情况下对 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
我无法将以 #
开头的字符串作为命令行参数传递。
这是一个简单的测试:
#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
。它读取 #
并停在那里。我不知道为什么,在我的 The C Programming Language 和 C Primer Plus.
这是因为您正在使用类似 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 中的变量仍然被展开。
#
在 Unix shells 中开始注释,很像 C 中的 //
。
这意味着当 shell 将参数传递给程序时,它会忽略# 后面的所有内容。用反斜杠或引号将其转义意味着它会像其他参数一样处理,程序应该按预期工作。
2 4 \# 5 6
或
2 4 '#' 5 6
或
2 4 "#" 5 6
请注意,#
是仅在单词开头的注释字符,因此这也应该有效:
2 4#5 6
通过命令行参数传递值时,您必须按照以下说明进行操作。 以下字符在某些情况下对 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