Kabukta değişken enterpolasyon


104

Adında bir değişkenim var filepath=/tmp/name.

Değişkene erişmek için bunu yapabileceğimi biliyorum: $filepath

Kabuk betiğimde buna benzer bir şey yapmaya çalıştım (geri işaretler amaçlanmıştır)

`tail -1 $filepath_newstap.sh`

Bu satır başarısız olur, duuh !, çünkü değişken çağrılmaz $filepath_newstap.sh

_newstap.shDeğişken adına nasıl eklenirim ?

Ters işaretlerin ifade değerlendirmesi için tasarlandığını lütfen unutmayın.

Yanıtlar:


187

Kullanım

"$filepath"_newstap.sh

veya

${filepath}_newstap.sh

veya

$filepath\_newstap.sh

_tanımlayıcılarda geçerli bir karakterdir. Nokta değil, bu yüzden kabuk enterpolasyon yapmaya çalıştı $filepath_newstap.

set -uTanımlanmamış bir değişkene başvurduğunuzda kabuğun bir hatayla çıkmasını sağlamak için kullanabilirsiniz .


7
set -uTanımlanmamış bir değişkene başvurursanız, komut dosyasının iptal edilmesine neden olanı da belirtebilirsiniz.
üçlü

1
${}Çift tırnak kullanmak ile çift tırnak arasındaki fark nedir ? Birini diğerine tercih etmeli miyim?
user31389

3
@ user31389: Aradaki fark, değişken boşluk içerdiğinde, yalnızca çift tırnaklar çalışır.
choroba

@choroba Değişken adı mı yoksa değişken değeri mi?
Joshua Pinter

16

Değişken adının etrafında küme parantezi kullanın:

`tail -1 ${filepath}_newstap.sh`

1
Çift tırnağa ihtiyacın yok mu?
michaelsnowden

@michaelsnowden Mutlaka değil. Güvende olmak için evet, ancak soru açıkça boşluksuz bir yol gösterdi ve ayrıca sorunun, sorunu çözecek şekilde amaçlanandan ziyade $filepath_newstap.shyorumlandığını öne sürdü . ${filepath_newstap}.sh${filepath}_newstap.sh

@michaelsnowden Bu bana zaten farkında olmadığım hiçbir şey söylemiyor. Neden çift tırnak gerekli olduğunu düşünüyorsunuz?

Çünkü dizi enterpolasyonu yapmaya çalışıyorsunuz ve bunun için çift tırnak işaretine ihtiyacınız var
michaelsnowden

@michaelsnowden Parametre yorumlaması ya çift tırnak içinde ya da tamamen tırnak dışında gerçekleşir. Parametre genişlemesini önlemenin tek yolu, tek tırnak işaretleri veya tırnak işaretli karakterleri veya tanımlayıcılarda geçerli olmayan diğer karakterleri ayırmaktır. Örneğin, "$filepath"_foove ${filepath}_fooher ikisi de olarak genişler /tmp/name_foo. Ancak '$filepath'_foo, "$"filepath_foove $"filepath"_footamamen tüm önlemek genişleme olur. Bu nedenle , ortam değişkenine ( parametre genişletmeye tabi olacak) export PATH=$PATH:$addpatheklemeye çalışır . :$addpathPATH

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.