Nie mogę przekazać ciągów zaczynających się #
od argumentów wiersza poleceń.
Oto prosty test:
#include <stdio.h>
int main(int argc, char *argv[])
{
for (int i = 1; i < argc; i++)
printf("%s ", argv[i]);
putchar('\n');
return 0;
}
Jeśli wprowadzę argumenty w następujący sposób:
2 4 # 5 6
Wartość argc
jest 3
i nie 6
. Tam czyta #
i zatrzymuje się. Nie wiem dlaczego i nie mogę znaleźć odpowiedzi w moich kopiach The C Programming Language i C Primer Plus .
c
bash
command-line-arguments
cd-00
źródło
źródło
Odpowiedzi:
#
zaczyna komentarz w powłokach uniksowych, podobnie jak//
w C.Oznacza to, że gdy powłoka przekazuje argumenty do progamu, ignoruje wszystko po znaku #. Ucieczka od ukośnika odwrotnego lub cudzysłowu oznacza, że jest traktowany jak inne parametry, a program powinien działać zgodnie z oczekiwaniami.
lub
lub
Pamiętaj, że
#
jest to znak komentarza tylko na początku słowa, więc powinno to również działać:źródło
echo echo Hello, World | bash
. Czy to jest interaktywne? A możebash <<END
?Podczas przekazywania wartości za pomocą argumentów wiersza poleceń należy wykonać następujące instrukcje. Następujące znaki mają specjalne znaczenie dla samej powłoki w niektórych kontekstach i może wymagać zmiany znaczenia w argumentach:
źródło
2 4 \{#,$,&,*} 5 6
To dlatego, że używasz
sh
podobnej do powłoki. Cytuj#
lub użyj\
go, a będzie działać.To się nazywa komentarz w
sh
. Powoduje#
to odrzucenie (skrótu spacji) i wszelkich argumentów po nim. Jest używany podobnie jak komentarze w C, gdzie służy do dokumentowania kodu.Ciągi rozpoczynające się od
$
są nazywane zmiennymi wsh
. Jeśli nie ustawiłeś zmiennej, zostanie ona rozwinięta do pustego ciągu.Na przykład wszystkie te sposoby byłyby prawidłowe do przekazania
#
aplikacji:I byłyby to prawidłowe sposoby przekazywania ciągu zaczynającego się od
$
:Pamiętaj, że zmienne wewnątrz
"
s są nadal rozwinięte.źródło