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 OPTINDbüyük harf) normalde bir getopts whiledöngüden hemen sonra bulunur . $OPTINDtarafı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 OPTINDkonumunu verir .
GNU Bash Referans Kılavuzundan :
getopts optstring adı [args]
getoptsKonumsal parametreleri ayrıştırmak için kabuk komut dosyaları tarafından kullanılır.optstringtanı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, birgetoptssonraki seçeneğinamevarsa kabuk değişken adına yerleştirir, yoksa başlatır ve değişkene işlenecek bir sonraki argümanın dizinidirOPTIND.OPTINDHer 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ıOPTINDotomatik olarak;getoptseğ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,
getoptssıfırdan büyük bir geri dönüş değeriyle çıkar.OPTINDilk seçenek olmayan bağımsız değişkenin dizine ayarlanır ve ad '?' olarak ayarlanır.
getoptsNormalde konum parametreleri ayrıştırır, ancak daha fazla argümanlar içinde verilirseargs,getoptsbunun 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 bashve dash).
$((...))sadece bir şeyler hesaplar. Sizin durumunuzda $optintve 1 altkümelerinin değerini alır
shiftkonumsal parametreleri kaldırır. Sizin durumunuzda optint-1parametreleri kaldırır .
Daha fazla bilgi için bir göz help getopts, help shiften göz man bash"Aritmetik genişletmesi" ve özellikle google getopts.