“$ {- # * i}”! = “$ -” ne anlama geliyor?


37

Gelen /etc/profileBunu görmek:

for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null 2>&1
        fi
    fi
done

Ne demek ${-#*i}istiyorsun Başlangıçta bir parametre genişletme tanımını bulamıyorum ${-.

Yanıtlar:


40

$-Kabuk tarafından, başlatma sırasında veya setbuiltin komutunu kullanarak ayarlanan geçerli seçenek bayrakları :

$ echo $-
himBH
$ set -a
$ echo $-
ahimBH

"${-#*i}"dize kaldırma sözdizimi: ( POSIX belgelerinden )

$ {Parametre # [kelime]}

En Küçük Önek Şablonunu Kaldırma. Bir kalıp oluşturmak için kelime genişletilecektir. Parametre genişlemesi daha sonra, önekin en küçük kısmı silinmiş kalıpla eşleştirilen parametreyle sonuçlanır. Eğer varsa, kelime bir alıntı olmadan '#' ile başlamaz.

$ {Parametre ## [kelime]}

En Büyük Önek Şablonunu Kaldırma. Bir kalıp oluşturmak için kelime genişletilecektir. Parametre genişlemesi daha sonra, önekin en büyük kısmı silinmiş kalıpla eşleştirilen parametreyle sonuçlanır.

Bu yüzden ${-#*i}ilk ikaraktere kadar en kısa dizgiyi kaldırın :

$ echo "${-#*i}"
mBH

Senin durumunda, if [ "${-#*i}" != "$-" ]kabuğunun etkileşimli olup olmadığını kontrol et.


23

Bir kabuk parametresi var $-. Benim durumumda:

$ echo $-
himB

${-}aynıdır $-aynen böyle ${foo}aynıdır $foo.

#*ianlamına gelir: Sil (mümkün olduğu kadar az; burada bir fark yaratmaz) değişken değerinin başından birincisine kadar (dahil) i.

$ echo "${-#*i}"
mB

Başka bir deyişle: değişkenin değerinde [ "${-#*i}" != "$-" ]bir ideğer olup $-olmadığını kontrol eder, yani kabuğun etkileşimli olup olmadığını kontrol eder.

Başka bir deyişle, yazmak için kıvrımlı ve Bourne uyumlu bir yöntemdir:

case $- in
  *i*) ...;;
  *) ...;;
esac

4
Yine de POSIX uyumludur .
Grawity
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.