Bir Linux üyesi değilim ama Projem için okumam gereken bazı Komut Dosyalarında sıkışıp kaldım. Bu komutun ne yaptığını kimse bana yardım edebilir mi?
shift $(($optind - 1))
Bir Linux üyesi değilim ama Projem için okumam gereken bazı Komut Dosyalarında sıkışıp kaldım. Bu komutun ne yaptığını kimse bana yardım edebilir mi?
shift $(($optind - 1))
Yanıtlar:
shift $((OPTIND-1))
(Not OPTIND
büyük harf) normalde bir getopts
while
döngüden hemen sonra bulunur . $OPTIND
tarafından bulunan seçeneklerin sayısıdır getopts
.
Pauljohn32'nin yorumlarında da belirtildiği gibi, kesinlikle konuşursak, bir sonraki komut satırı argümanının OPTIND
konumunu verir .
GNU Bash Referans Kılavuzundan :
getopts optstring adı [args]
getopts
Konumsal parametreleri ayrıştırmak için kabuk komut dosyaları tarafından kullanılır.optstring
tanınacak seçenek karakterlerini içerir; Eğer bir karakteri iki nokta üst üste takip ederse, seçeneğin boşlukla ayrılması gereken bir argüman olması beklenir. İki nokta üst üste (':') ve soru işareti ('?') Seçenek karakterleri olarak kullanılamaz. Her çağrıldığında, birgetopts
sonraki seçeneğiname
varsa kabuk değişken adına yerleştirir, yoksa başlatır ve değişkene işlenecek bir sonraki argümanın dizinidirOPTIND
.OPTIND
Her kabuk veya kabuk komut dosyası çağrıldığında 1 olarak başlatılır. Bir seçenek bir argüman gerektirdiğinde, getopts bu argümanı değişkene yerleştirirOPTARG
. Kabuk sıfırlanmadıOPTIND
otomatik olarak;getopts
eğer yeni bir parametre seti kullanılacaksa, aynı arama çağrısına birden fazla çağrı arasında manuel olarak sıfırlanması gerekir .Seçeneklerin sonuna gelindiğinde,
getopts
sıfırdan büyük bir geri dönüş değeriyle çıkar.OPTIND
ilk seçenek olmayan bağımsız değişkenin dizine ayarlanır ve ad '?' olarak ayarlanır.
getopts
Normalde konum parametreleri ayrıştırır, ancak daha fazla argümanlar içinde verilirseargs
,getopts
bunun yerine bu ayrıştırır.
shift
n, n dizelerini konumsal parametreler listesinden
siler . Böylece , parametreler listesinden ayrıştırılan tüm seçenekleri kaldırır ve bu noktadan sonra komut dosyasına iletilen ilk seçenek olmayan argümana atıfta bulunacaktır.shift $((OPTIND-1))
getopts
$1
Güncelleştirme
Mikeserv'in yorumunda belirttiği gibi, shift $((OPTIND-1))
güvensiz olabilir. İstenmeyen sözcük bölme vs.'yi önlemek için tüm parametre genişletmelerinin çift alıntı yapılması gerekir. Yani komut için güvenli bir form
shift "$((OPTIND-1))"
find
), seçenek dışı olduktan sonra seçeneklere izin veriyor gibi görünebilirler , fakat yapmazlar: bir çizgi ile başlayan operandlara sahiptirler.
IFS
, ancak üzgün olmaktan daha güvenli olmak daha iyi. ;)
IFS=0123456789
, shift $((OPTIND-1))
(tırnaklar olmadan) dönüşecek shift ""
olan sessizce (yok sayılacak ksh
) veya (bir hata üretir bash
ve dash
).
$((...))
sadece bir şeyler hesaplar. Sizin durumunuzda $optint
ve 1 altkümelerinin değerini alır
shift
konumsal parametreleri kaldırır. Sizin durumunuzda optint-1
parametreleri kaldırır .
Daha fazla bilgi için bir göz help getopts
, help shift
en göz man bash
"Aritmetik genişletmesi" ve özellikle google getopts
.