$ '$ Foo' ve $ “$ foo” arasındaki fark


9

Değişken bağlamda tek ve çift tırnaklar arasındaki nüansları anlamakta güçlük çekiyorum

Ben tanımlarım:

foo=pwd

sonra bunları çalıştırın:

echo $'$foo'

Hangi ekolar $foo( $eko komutumdaki ilk yansıma kaldırılır)

echo $"$foo"

Bu echos pwd(yani bash $foodeğişkenim değerine genişler )

echo $`$foo`

Sonunda bu echos $~/scripts(yazdırmasını bekliyordum ~/scripts, değil $~/scripts)

birisi bu farklılıkları anlamama yardımcı olabilir mi?

Yanıtlar:


11

Nihayetinde, sonuncusu yazdırır $~/scriptsçünkü $`foo`bir değişmezin $ardından bir komut ikamesi kombinasyonu ; böylece önder $bir değişmez $ve sondaki `$foo`bir komut yerine geçme olarak yorumlanır.


Kod etiketlerini kaldırdım ve sadece `` `` `` `` karakterler vb. İle değiştirdim. Kod etiketlerini tercih ederseniz geri dönmekten çekinmeyin
Tim

@Tim Teşekkürler, tam olarak ne yaptığımdan emin değilim, ancak düzenledikten sonra herhangi bir nedenden dolayı yayın ilk revizyonumdaki gibi bozuldu, bu yüzden geri aldım ... Ve şimdi revizyonda iyi göründüğünü görüyorum. Ne olduğundan emin değilim, yazıyı tekrar bozacağımdan korktuğumdan sürümünüze geri dönmeden önce biçimlendirme sanal alanında test edeceğim. Ne olursa olsun, çaba için teşekkürler.
kos

elbette, sorun yok. Benimki sıfır genişlikli alanlar kullanıyor, bu yüzden düzenlerken dikkatli olun.
Tim

2

İlk durum:

echo $'$foo'

Hangi ekolar $foo( $eko komutumdaki ilk yansıma kaldırılır)

Birincisi $bir komut olarak çalıştırılır. Yankı, argümanlar arasında boşluk gerektirmez, sadece onları alır.

Yani echo $'$foo'komutu çalıştırmak için genişler $(ki bu bir komut değildir, böylece onu yok sayar) ve sonra echo '$foo'. İçindeki herhangi bir şey ''nominal değerde alınır - onu genişletmez ya da hiçbir şey yapmaz. İstediğinizi koyabilirsiniz '' ve hiçbir şey olmuyor.

Eğer değiştirirseniz $ile $$buna işlem kimliğini echos.


İkinci:

echo $"$foo"

Bu echos pwd(yani bash $foodeğişkenim değerine genişler )

Çünkü ""genişlemesini engellemiyor. ""normalde karşılaştırılacak bir değer olmasını sağlamak için kullanılır.

Boş olabilecek bir değişkeniniz varsa (örneğin, bir grepsonuçtan kaynaklanıyorsa), başka bir değer / değişkenle karşılaştırmak istiyorsanız, ilk değişkeni koymanız gerekir "". Bu, hata veren yalnızca boş bir kod bölümü (bash'ın gördüğü gibi) yerine her zaman kontrol edilecek bir karşılaştırma olmasını sağlar.


Son olarak, 3 numara. Bu ilginç.

echo $`$foo`

Bu yankılanırken $~/scripts(ı yazdırmak için beklenen ~/scriptsdeğil $~/scripts)

Çünkü (bu durumda) yankı önce $karakteri yazdırıyor . Bir şeyi ters tırnaklara koymak , değişkenin değerinin bir komut olarak çalıştırılmasına neden olur (bunu bash'ın daha yeni sürümlerinde yapmanın daha iyi yolu $(command))

Böylece ilk o echos $genişlediğinde sonra ​`$foo`​hiç ​`pwd`​çalıştırın ve döner hangi ~/Scripts. Ama $baskıyı daha önce yaptık - yani tüm çıktı $~/Scripts.


Bazı zor biçimlendirme üzerinde iyi iş!
Şubat'ta Arronical

1
@Arronical Thanks :) Göremiyorum ama son cümle için sıfır genişlikli boşluklar var. Hayali internet noktaları için yaptığım şeyler ...!
Tim

1
+1 İyi cevap. Sadece olası null değerleri işlemek için değil - belirli bir nedeni yoksa tırnak değişkenleri varsayılan olması gerektiğini eklemek istiyorum. Bu konuda bilmek istediğinizden daha fazla bilgi için unix.stackexchange.com/questions/171346/… adresine bakın . ;)
Joe
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.