'#' Karakteri komut satırı bağımsız değişkeni olarak iletilemiyor


36

#Komut satırı bağımsız değişkenleri ile başlayan dizeleri geçemiyorum .

İşte basit bir 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;
}

Eğer argümanları aşağıdaki gibi girersem:

2 4 # 5 6

Değeri argcolan 3olup 6. #Orada okur ve durur. Nedenini bilmiyorum ve cevabı C Programlama Dili ve C Primer Plus kopyalarımda bulamıyorum .


44
StackOverflow üzerinde sözdizimi vurgulama sorununuzu güzel bir şekilde göstermektedir :)
Brad Allred

Yanıtlar:


47

#//C gibi, Unix kabuklarında bir yorum yapmaya başlar .

Bu, kabuk argümanları progam'a geçirdiğinde, # işaretinden sonraki her şeyi yok sayar. Bir ters eğik çizgi veya tırnak işareti ile kaçması, diğer parametreler gibi ele alındığı ve programın beklendiği gibi çalışması gerektiği anlamına gelir.

2 4 \# 5 6

veya

2 4 '#' 5 6

veya

2 4 "#" 5 6

Bunun #yalnızca bir sözcüğün başlangıcında yorum karakteri olduğunu unutmayın;

2 4#5 6

2
Bu oldukça iyi bir liste gibi görünüyor unix.stackexchange.com/a/270979
fanduin

22
@ cd-00 Kabuğun nasıl çalıştığını öğrenmeniz gerekir. Bunun C kodunuzla bir ilgisi yoktur.
chepner

3
Ah, böylece etkileşimli kabuk oturumlarına yorum yazabilirsiniz , böylece kabuk yazmayı bitirdikten sonra hemen göz ardı edebilir. Ne kullanışlı bir özellik.
Joker_vD

6
@Joker_vD Bir kabuğu komut satırı arabirimi olarak düşünürken, aslında bir betik yorumlayıcısıdır. Etkileşimli bir CLI gibi kullanabilmeniz güzel bir bonus. "Komut dosyası çalıştırırken" veya komutları etkileşimli olarak yazarken, yorumlanan neden önemli ölçüde farklı davranmalıdır? Ne olmuş echo echo Hello, World | bash. Etkileşimli mi? Ya da belki bash <<END?
Christopher Schultz

6
@Joker_vD: Sık sık kabuk geçmişimde başvurmak için etkileşimli oturumlarda yorumlar yazıyorum. Bazen bu, stdout'a verilen bir sağlama karmasını veya başka bir kimliği kaydetmek içindir; bazen bir komutun gelecekteki kendime not olarak başarısız olduğunu belirtmek gerekir; bazen geçici kıyaslama için zamanlama verilerini kaydetmek içindir. Bu ise önemli bir özellik.
wchargin

12

Değeri komut satırı argümanlarından geçirirken aşağıdaki talimatları izlemeniz gerekir. Aşağıdaki karakterlerin bazı bağlamlarda kabuğun kendisi için özel bir anlamı vardır ve bağımsız değişkenlerden kaçmaları gerekebilir:

` 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
O zaman nasıl kaçmalılar?
ilkkachu

3
\ - Ters eğik çizgi kullanılarak kaçtı .EX:2 4 \{#,$,&,*} 5 6
VJAYSLN

8

Çünkü shbenzeri bir kabuk kullanıyorsunuz . Alıntı #veya kullanarak kaçmak \ve işe yarayacak.

Buna içinde yorum denir sh. Bu neden #atılmalıdır sonrası (boşluk karması) ve herhangi bir bağımsız değişkeni. Kodu belgelemek için kullanıldığı C'deki yorumlara benzer şekilde kullanılır.

İle başlayan Strings $denir değişkenleri içinde sh. Bir değişken ayarlamadıysanız, boş bir dizeye genişler.

Örneğin, bunların tümü #başvurunuza geçmenin geçerli yolları olacaktır :

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

Ve bunlar, aşağıdakilerden başlayarak bir dizeyi geçirmenin geçerli yolları olacaktır $:

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

Lütfen "s içindeki değişkenlerin hala genişlediğini unutmayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.