“$ {PS1-}” geçerli bir sözdizimi mi ve düz “$ PS1” den farkı nedir?


12

Ben bir komut dosyasına bakıyorum:

if [ "${PS1-}" ]; then

Bu sonda -beni biraz rahatsız ediyor çünkü Posix veya Bash standart sözdizimine benzemiyor. Bu sonsuza dek süren bazı gizli sözdizimi mi yoksa bir yazım hatası mı? Standartlara / belgelere yapılan göndermeler takdir edilecektir.

Normalde onu kodlamak istiyorum:

if [ "$PS1" ]; then

Hangisi daha doğru veya aralarında fark var mı?

Yanıtlar:


12

Bu kesinlikle POSIX sözdizimidir . alıntı yapan:

Kullanılması ${parameter-word}halinde, parameterolduğu

  • null değil, null değerini ayarlayın parameter,
  • fakat null değerini girin, null yerine koyun ve
  • ayarını kaldırın, yerine koyun word.

Örnek oturum:

$ echo "${parameter-word}"
word
$ parameter=
$ echo "${parameter-word}"

$ parameter=value
$ echo "${parameter-word}"
value

Burada "Null" boş dizeyi ifade eder. Örneğin, SQL'in aksine POSIX kabuklarında özel bir boş değer yoktur.

Bu ayrıca, "Parametre Genişletme" bölümünde de belgelenmiştir man bash.


1
Sanırım bash ve tire man sayfaları eksik çünkü bu söz diziminden (tek) bahsetmiyorlar!
Gregor

1
@Gregor Her iki kılavuz da bundan bahsediyor. Bash kılavuzunda parametre genişletmeleri listesinden önceki paragrafta ve Dash kılavuzunda sonraki paragrafta yer almaktadır.
Kusalananda

1
Tamam, "İki nokta üst üste işareti ...." Bunu görmedim :(
Gregor

zshbunun bildiğim tek kabuk, sadece kolonun atlamasının ne olduğunu not etmek yerine, kolonsuz varyantlardan açıkça bahsettiğidir.
chepner

1
@pts, POSIX'teki metin hemen hemen yalnızca "null" terimini kullanır ve bu, man sayfalarındaki kullanımını açıklayabilir.
ilkkachu

23

Değişken genişletme ${parameter:-word}, $parameterayarlanmışsa ve boş değilse (boş bir dize değil) değerini kullanır, aksi takdirde dizeyi kullanır word.

:Değerin atlanması, değerin boş olup olmadığını, yalnızca ayarlanıp ayarlanmadığını test etmez.

Bu , ayarlanmışsa ${PS1-}değerine, $PS1boş veya ayarlanmamışsa boş bir dizeye genişleyeceği anlamına gelir . Bu durumda, bu tam olarak aynı şekilde ${PS1:-}dize sonra mümkün -de boş olduğunu.

@Rakesh Sharma'nın belirttiği gibi "${PS1-}"ve arasındaki fark "$PS1", her ikisi de değerine $PS1veya ayarlanmamışsa boş bir dizeye genişleyecektir . Bunun istisnası set -uetkin olduğu zamandır, bu durumda ayarlanmamış değişkenlerin genişletilmesi hataya neden olur . Ayarlanan (boş) varsayılan değer "${PS1-}"bunu atlayarak bir PS1diziyi hatasız olarak boş dizeye genişletir .

Bu standart sözdizimidir ( 70'lerin sonlarında Bourne kabuğunda ortaya çıkar ), diğer birkaç benzer genişleme gibi.


Ve alıntılandığından "$PS1"beri PS1, boşsa, boştur ve tırnaklar sözcüğün tamamen kaybolmasını önler.
ilkkachu

4
set -uEtkisi olmadığı sürece . İsim seti seçeneği açık olduğunda, "$ PS1" => hata verir. "$ {PS-}" olmayacak.

@RakeshSharma bu iyi bir nokta. Farklı sözdizimi aslında isim seti seçeneğine bağlı olarak farklı sonuçlar verebilir, bu nedenle test ["$ {parametre-}"] muhtemelen daha doğrudur!
Gregor

1
@Kusalananda: NULL-NULL ise ${parameter:-word}değerini kullanacağını lütfen unutmayın $parameter. Diğer tüm durumlarda (yani: ya set ama NULL ya da unset) kullanır word. if its set or null

@ikkachu: Evet, doğru. Yalnızca değişkenler set AND nonnull=> kullanıldığında .Otherwise, ( set but NULL OR unset) => sözcüğü kullanın.

6

Sözdizimi:

${parameter:-word}

ve özel bir form:

${parameter-word}

olduğu POSIX kabuğunda geçerli söz dizimi , varsayılan değerini kullanarak aracı wordise parameterayarlanmazsa veya null.


Normalde ile wordboş, sonra:

${parameter-}

ve:

$parameter

veya:

${parameter}

eşdeğerdir.

Ancak etkisi altında set -u, tüm ayarlanmamış değişkenler kabuğun sonlandırılmasına neden olur. ${parameter-}bu katı kuralı atlamak için kullanılır. Her iki durumda da çalışır, bu yüzden evet, daha doğru bir şekilde.

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.