Je ne peux pas transmettre de chaînes commençant par #
comme arguments de ligne de commande.
Voici un test simple:
#include <stdio.h>
int main(int argc, char *argv[])
{
for (int i = 1; i < argc; i++)
printf("%s ", argv[i]);
putchar('\n');
return 0;
}
Si j'entre les arguments comme suit:
2 4 # 5 6
La valeur de argc
est 3
et pas 6
. Ça lit #
et s'arrête là. Je ne sais pas pourquoi et je ne trouve pas la réponse dans mes copies de The C Programming Language et C Primer Plus.
#
commence un commentaire dans les shells Unix, un peu comme //
en C.
Cela signifie que lorsque le shell transmet les arguments au programme, il ignore tout ce qui suit le #. L'échapper avec une barre oblique inverse ou des guillemets signifie qu'il est traité comme les autres paramètres et que le programme devrait fonctionner comme prévu.
2 4 \# 5 6
ou
2 4 '#' 5 6
ou
2 4 "#" 5 6
Notez que le #
n'est un caractère de commentaire qu'au début d'un Word, donc cela devrait également fonctionner:
2 4#5 6
Lorsque vous passez la valeur via des arguments de ligne de commande, vous devez parcourir ces instructions suivantes. Les caractères suivants ont une signification particulière pour le shell lui-même dans certains contextes et peuvent devoir être échappés dans les arguments:
` 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
C'est parce que vous utilisez un shell semblable à sh
. Citez le #
ou échappez-vous en utilisant \
et cela fonctionnera.
C'est ce qu'on appelle un commentaire dans sh
. Il provoque le #
(espace-hachage) et tous les arguments suivants à supprimer. Il est utilisé de manière similaire aux commentaires en C, où il est utilisé pour documenter le code.
Chaînes commençant par $
sont appelés variables dans sh
. Si vous n'avez pas défini de variable, elle se développera en une chaîne vide.
Par exemple, tous ces éléments seraient des moyens valides de passer le #
à votre candidature:
2 4 '#' 5 6
2 4 "#" 5 6
2 4 \# 5 6
Et ce seraient des moyens valides de passer une chaîne commençant par $
:
2 4 '$var' 5 6
2 4 '$'var 5 6
2 4 \$var 5 6
Veuillez noter que les variables à l'intérieur de "
s sont encore développés.