Não é possível passar '#' como argumento da linha de comando




bash command-line-arguments (2)

Não consigo passar strings começando com # como argumentos da linha de comando.

Aqui está um teste simples:

#include <stdio.h>

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

    putchar('\n');

    return 0;
}

Se eu inserir argumentos da seguinte maneira:

2 4 # 5 6

O valor de argc é 3 e não 6 . Ele lê # e para aí. Não sei por que e não consigo encontrar a resposta em minhas cópias da linguagem de programação C e do C Primer Plus .


É porque você está usando um shell tipo sh . Cite o # ou escape usando \ e ele funcionará.

Isso é chamado de comentário em sh . Isso faz com que o # (espaço-hash) e quaisquer argumentos depois sejam descartados. É usado de maneira semelhante aos comentários em C, onde é usado para documentar o código.

Sequências começando com $ são chamadas variáveis em sh . Se você não definiu uma variável, ela será expandida para uma sequência vazia.

Por exemplo, todas essas seriam maneiras válidas de passar o # para seu aplicativo:

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

E essas seriam maneiras válidas de passar uma string começando com $ :

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

Observe que as variáveis ​​dentro de " s " ainda são expandidas.


Ao passar o valor pelos argumentos da linha de comando, você deve seguir estas instruções a seguir. Os seguintes caracteres têm um significado especial para o próprio shell em alguns contextos e podem precisar ser ignorados nos argumentos:

` 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




command-line-arguments