Echo -e “<string>” ve echo $ “<string>” arasındaki fark


20

Kullanmak arasındaki fark nedir

echo -e "Hello\nWorld" 

ve

echo $"Hello\nWorld" 

ikisi de çıktı değil mi:

Hello
World

1
Onu denedin mi? İkincisi çıktı Hello\nWorld. -eKaçış karakterlerini yorumlamak için anahtara ihtiyacınız var .
becko

4
İkincisi için, echo $'Hello\nWorld'bash altındaki iki satıra yazdırılacak tek tırnaklarla yazmak istediğinizden şüpheleniyorum .
John1024

@becko, evet denedim ve ikisi de aynı şeyi çıktı.
Mark

Yanıtlar:


33

echo -eve echo $'...'her ikisi de aşağıdaki kaçış dizilerini desteklemeleri bakımından benzerdir:

  \a     alert (bell)
  \b     backspace
  \e
  \E     an escape character
  \f     form feed
  \n     new line
  \r     carriage return
  \t     horizontal tab
  \v     vertical tab
  \\     backslash
  \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal digits)
  \xHH   the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)
  \uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits)
  \UHHHHHHHH
         the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits)

Farklılıkları var. Yukarıdakilere ek olarak, echo -eşunları destekler:

  \c     suppress further output
  \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal digits)

Buna karşılık, $'....'şunları destekler:

 \'     single quote
 \"     double quote
 \nnn   the eight-bit character whose value is the octal value nnn (one to three digits)
 \cx    a control-x character

İkisi arasında \cuzantıların uyumsuz olduğuna dikkat edin :

$ echo -e  'start\n\cIstop'
start
$ echo  $'start\n\cIstop'
start
        stop

İçin echo -eyukarıdaki \cve böylece göz ardı ederek, daha çıkış bastırır Istop. Buna karşılık, için $'...', \cIbir sekme olarak yorumlanır.

Görsel olarak benzer form: $"..."

Buna karşılık $'...', işlevi $"..."oldukça farklıdır. İçerdiği dizginin geçerli yerel ayara göre çevrilmesine neden olur.

echo -etartışma

echo -eevrensel olarak mermiler tarafından desteklenmez ve birçoğu -eseçeneği tasarım hatası olarak görür. Gözlemek:

$ ls
-e  -n
$ echo *
$ printf "%s\n" *
-e
-n

Gördüğünüz gibi, yazdırdığınız şey echobir tire işareti ile başlarsa, sonuçlar beklenmedik olabilir. Yazdıracağınız ilk dizenin echobir tire işareti ile başlamadığından emin değilseniz, muhtemelen daha iyi durumda olursunuz printf.

Bu nedenlerle POSIX standardı şu sonuca varır :

Yeni uygulamaların echo yerine printf kullanmaları önerilir.

bashSon 22 yıldır sürdüren Chet Ramey de aynı fikirde :

[N] yeni kod printf kullanmalıdır.


1
Her iki fazlalaştı Chet ve POSIX kullanarak tavsiye printfyerineecho
geirha

@geirha Çok iyi puanlar. Yanıt güncellendi.
John1024

1
Glob'lardan (gibi *) beklenmedik seçenekler sorunu aslında spesifik değildir echo. Kısa veya uzun seçenekleri (geleneksel şekilde yazılmış) tanıyan ve dahil olmak üzerels dosya adı işlenenlerini alan herhangi bir komutla olur . Muhtemelen durum biraz daha kötüdür echo(kaynaklarınızdan bahsedildiği gibi) echogenellikle --seçeneklerin sonunu belirtmeyi kabul etmezken, biri gibi komutlar yazabilir ls -- *l. (Ve gerçekten, genellikle komut dosyalarında *veya -özellikle komut dosyalarında başlayan
globları

Kapsamlı Cevabınız için teşekkür ederim, ben ki benim İşletim Sistemleri için bir excercise var ve kullanarak bazı metin yazdırmak için gerekli \nkullandığım eğer öyleyse aslında önemli değil, kaçış dizisi echo -e '...', echo $'...'veyaecho $"..."
Mark
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.