Kabuk komut dosyalarında $ {0% / *} ne yapar?


17

Bu aptalca bir soru ise özür dilerim, ama başarılı olamadım.

İkinci satır tam olarak ne yapar?

#!/bin/sh
cd ${0%/*} || exit 1

İlki biliyorum, ikinci dizin değiştirmek için çalışır ama kafa karıştırıcı kısmı ${0%/*}.

Bana bu ikinci satırı açıklar mısınız?


2
Andrea tarafından bir yanıtta açıklandığı gibi, $ {0% / *} çağrılırken kod adına önek olarak eklenmiş dizin yoluna çevirir. Bir alternatif, yerleşik dirnamekomutu kullanmaktır$(dirname $0)
alwayslearning

@alwayslearning: Yerleşik olan hangi kabuk ve kabuk sürümünü kullanıyorsunuz dirname? Ubuntu Trusty'deki varsayılan kabuk olan Bash v4.3.11'de kesinlikle değil.
David Foerster

Karışıklık için özür dilerim, sadece dirnamebir kabuk yerleşik olmadığını kontrol ettim .
alwayslearning

Yanıtlar:


27

${0}kodun ilk argümanıdır, yani kod adı veya yolu. Eğer komut olarak başlatmak varsa path/to/script.sh, o zaman ${0}tam olarak bu dize olacaktır: path/to/script.sh.

%/*Bölüm değerini değiştirir ${0}. Bu şu anlama gelir: /arkasından bir dosya adı gelene kadar tüm karakterleri alır . Yukarıdaki örnekte, ${0%/*}olacaktır path/to.

Kabuğunuzda çalışırken görebilirsiniz:

$ x=path/to/script.sh
$ echo "${x%/*}"
path/to

Sh, diğer birçok "parametre ikamesi" ni destekler. Örneğin, yol yerine dosya adını nasıl alacağınız aşağıda açıklanmıştır:

$ echo "${x##*/}"
script.sh

Genel olarak %ve %%şerit ekleri, while #ve ##şerit önekleri. Parametre değiştirme hakkında daha fazla bilgi edinebilirsiniz .


2
Bu "|| çıkış 1" gereksiz gibi görünüyor: dir $ değiştirmek için şimdi olacak? 1'e eşittir
Josef Klimuk

2
Yapının kılavuzda "Eşleşen önek / sonek desenini kaldır" olarak belgelendiğinden bahsetmek güzel olurdu. Ayrıca hatırlamak için güzel bir yol # hangisi 3 ( $'ın solunda ),% 5'i ( $'ın sağında ), en azından ABD klavyesinde.
chexum

1
@JosefKlimuk: gerekli || exit 1 olabilir , çünkü cdhata durumunda 1 değil durum 2 ile çıkabilir. Ancak bunun çok yararlı olmadığını kabul ediyorum (genellikle programlar belirli çıkış durumlarını umursamıyor). Muhtemelen bu daha büyük bir betiğin parçası mı?
Andrea Corbellini

1
@AndreaCorbellini Kesinlikle doğru. Yararlı kullanabileceği tek yol, daha büyük bir komut dosyasının bir parçasıdır. Yalnızca geçerli dizini değiştiren bir komut dosyasının hiçbir etkisi yoktur, çünkü yalnızca bir komut dosyasını çalıştıran kabuğu etkiler. Üst süreç bunu asla görmez.
hvd
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.