Yanıtlar:
echo -e ' \t '
'boşluk sekmesi boşluk satırsonu' yankılanacaktır ( -e
'ters eğik çizgi kaçışlarının yorumlanmasını etkinleştir ' anlamına gelir):
$ echo -e ' \t ' | hexdump -C
00000000 20 09 20 0a | . .|
echo -e
Makefiles'den çalışmıyor?
echo -e
POSIX değildir ve normalde programın kullanmadığı make
çağrılar /bin/sh
etkileşimli olarak kullanılır ve normalde -e
uygulanmaz. Taşınabilirlik için printf '\t'
kullanın.
man
sayfası echo
seçeneği belirtmiyor -e
. Ancak, bu seçenek kabul edilir.
Kullan printf
, değil echo
.
echo
Komutun birden fazla farklı sürümü vardır . Orada /bin/echo
(olan veya sisteme bağlı olarak, GNU coreutils sürüm olmayabilir) ve echo
komut çoğu kabukları içine inşa edilmiştir. Farklı sürümler, kontrol karakterleri için kaçışları belirtmenin veya devre dışı bırakmanın farklı yollarına (veya hiçbir yoluna) sahip değildir.
printf
Öte yandan, çok daha az varyasyona sahiptir. Genellikle bir komut olarak var olabilir /bin/printf
ve bazı kabuklarda yerleşiktir (bash ve zsh var, tcsh ve ksh yok), ancak çeşitli versiyonlar farklı versiyonlarından çok daha benzerdir echo
. Ve komut satırı seçeneklerini hatırlamak zorunda değilsiniz (birkaç istisna dışında; GNU Coreutils printf kabul eder --version
ve --help
yerleşik bash printf -v var
çıktıyı bir değişkende saklamayı kabul eder ).
Örneğiniz için:
res=' 'x # res = "\t\tx"
printf '%s\n' "[$res]"
Ve şimdi, benim echo
de sorduğunuz örnek için de işe yarayacağını kabul etmenin zamanı geldi ; argümanın etrafına çift tırnak koymanız yeterlidir:
echo "[$res]"
kmkaplan'ın yazdığı gibi (iki buçuk yıl önce, fark ettim!). Orijinal komutlarınızla ilgili sorun:
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
ile değil echo
; kabuğun sekmeyi daha önce görmeden bir boşlukla değiştirmesidir echo
.
echo
gibi basit çıktılar için iyidir echo hello world
, ancak printf
daha karmaşık bir şey yapmak istediğinizde kullanmalısınız . Sen edebilirsiniz olsun echo
işe, ancak çıkan kod farklı bir ile çalıştırdığınızda başarısız olması muhtemeldir echo
uygulanması ya da farklı bir kabuk.
Ayrıca deneyebilirsiniz:
echo Hello$'\t'world.
Bash man sayfasından:
$ 'String' biçimindeki kelimeler özel olarak ele alınır. Sözcük dizeye genişler, ters eğik çizgiden kaçan karakterler ANSI C standardında belirtildiği gibi değiştirilir.
Böylece bunu yapabilirsiniz:
echo $'hello\tworld'
, Kelimesi kelimesine tuş kullanın ^V
( CTRL+V
, C-v
, ne olursa olsun ).
^V
Terminale (veya çoğu Unix editöründe) yazdığınızda , aşağıdaki karakter kelimesi kelimesine alınır . Yankıladığınız bir dizenin içine değişmez sekme karakteri yazmak için bunu kullanabilirsiniz.
Aşağıdaki gibi bir şey çalışır:
echo "^V<tab>" # CTRL+V, TAB
Bash belgeleri ( qv , "alıntı-insert")
quoted-insert (Cq, Cv) Satır yazdığınız bir sonraki karakteri kelimeye ekleyin. Örneğin, Cq gibi tuş dizileri bu şekilde eklenir.
yan not: buna göre ALT+TAB
, aynı şeyi yapmalıyız, ama hepimiz bu diziyi pencere geçişine bağladık, bu yüzden kullanamayız
tab-insert (M-SEKME) Bir sekme karakteri girin.
-
Not: Bu stratejiyi her türlü olağandışı karakterle kullanabilirsiniz. Bir satır başı gibi:
echo "^V^M" # CTRL+V, CTRL+M
Bunun nedeni, satır başı ASCII 13 ve M alfabenin 13. harfidir, bu nedenle yazdığınızda ^M
13. ASCII karakterini alırsınız. ls^M
Boş bir komut istemini kullanarak , bir satırbaşı ekleyecek ve istemin dönüşe çarptığınız gibi davranmasına neden olacak şekilde eylemde görebilirsiniz. Bu karakterler normal olarak yorumlandığında, kelimesi kelimesine değişmez karakteri elde etmenizi sağlar.
grep
içeren satırları yakalamak için kullanmaya çalışırken günümü kurtardım tab
.
Değişkenlerin değerlerini yazdırmak için echo kullanmak yaygın bir Bash tuzaktır. Referans bağlantısı: