Goldilocks' yorum ve insanlığın referanslar tarifine göre
shift(konumsal parametreler yeniden atar $1, $2böylece, vs.) $1eski değerini alır $2,
$2değeri alır $3, vb *
eski değerini $1atılır. ( $0değişmez.) Bunu yapmanın bazı nedenleri şunlardır:
- Onuncu argümana (varsa) daha kolay erişmenizi sağlar.
$10çalışmaz - $1bir ile birleşmiş olarak yorumlanır 0
(ve bu yüzden benzer bir şey üretebilir Hello0). Bir sonra shift, onuncu argüman olur $9. (Ancak, çoğu modern mermide kullanabilirsiniz ${10}.)
- As Başlayanlar için Bash Kılavuzu gösteriyor, bu argümanları döngü kullanılabilir. IMNSHO, bu sakar;
forbunun için çok daha iyi.
- Örnek komut dosyanızda olduğu gibi, birkaç değişken dışında tüm argümanları aynı şekilde işlemeyi kolaylaştırır. Örneğin, komut dosyanızda
$1ve $2metin dizeleri, süre $3ve diğer tüm parametreler dosya adlarıdır.
Yani işte nasıl oynandığı. Diyelim ki betiğinizin Patryk_scriptve bunun
Patryk_script USSR Russia Treaty1 Atlas2 Pravda3
Komut dosyası görür
$1 = USSR
$2 = Russia
$3 = Treaty1
$4 = Atlas2
$5 = Pravda3
İfadesi ostr="$1"değişken setleri ostriçin USSR. İlk shiftifade, konum parametrelerini aşağıdaki gibi değiştirir:
$1 = Russia
$2 = Treaty1
$3 = Atlas2
$4 = Pravda3
İfadesi nstr="$1"değişken setleri nstriçin Russia. İkinci shiftifade konumsal parametreleri aşağıdaki gibi değiştirir:
$1 = Treaty1
$2 = Atlas2
$3 = Pravda3
Sonra fordöngü değişiklikleri USSR( $ostrkadar) Russia( $nstrdosyalarda) Treaty1, Atlas2ve Pravda3.
Komut dosyasında birkaç sorun var.
$ @ içindeki dosya için; yap
Eğer komut dosyası olarak çağrılırsa
Patryk_script SSCB Rusya Antlaşması1 "Dünya Atlası2" Pravda3
görüyor
1 $ = SSCB
2 ABD Doları = Rusya
3 ABD Doları = Antlaşma 1
4 $ = Dünya Atlası2
5 $ = Pravda3
çünkü, $@alıntı değildir, uzay World Atlas2alıntı değildir ve fordöngü bu dört dosya vardır düşünür: Treaty1, World, Atlas2, ve Pravda3. Bu ya olmalı
"$ @" içindeki dosya için; yap
(bağımsız değişkenlerdeki herhangi bir özel karakteri alıntılamak için) veya basitçe
dosya yapmak için
(daha uzun sürüme eşdeğerdir).
eval "sed 's /" $ ostr "/" $ nstr "/ g' $ dosyası"
Bunun bir olmasına gerek yoktur evalve denetlenmeyen bir kullanıcı girişini bir kanala geçirmek evaltehlikeli olabilir. Örneğin, komut dosyası olarak çağrılırsa
Patryk_script "'; rm *;'" Rusya Antlaşması1 Atlas2 Pravda3
yürütecek rm *! Eğer komut dosyası, onu çağıran kullanıcınınkinden daha yüksek ayrıcalıklarla çalıştırılabilirse, bu büyük bir endişe kaynağıdır; örneğin, sudobir web arayüzünden çalıştırılabilir veya çalıştırılabilirse . Dizininizde, sadece kendiniz olarak kullanıyorsanız, muhtemelen o kadar önemli değildir. Ancak olarak değiştirilebilir
sed "s / $ ostr / $ nstr / g" "$ dosyası"
Bunun hala bazı riskleri var, ancak daha az şiddetli.
if [ -f $file ], > $file.tmpVe mv $file.tmp $file
olması gerektiği if [ -f "$file" ], > "$file.tmp"ve mv "$file.tmp" "$file"bunları boşluklar (veya diğer komik karakter) sahip olabilir dosya adları işlemek için sırasıyla. ( eval "sed …Komut ayrıca içinde boşluk bulunan dosya adlarını da düzenler.)
* shift isteğe bağlı bir argüman alır: kaç parametrenin kaydırılacağını belirten pozitif bir tamsayı. Varsayılan değer one ( 1) ' dır . Örneğin, shift 4neden $5
olmaya $1,
$6olmaya $2vb, vb. ( Yeni Başlayanlar İçin Bash Kılavuzundaki örnekte yanlış olduğuna dikkat edin .)
ostr="$1"
nstr="$2"
shift 2
daha net olduğu düşünülebilir.
Son Not / Uyarı:
Windows Komut İstemi (toplu iş dosyası) dili SHIFT, aynı zamanda, shiftUnix mermilerindeki komutla aynı şeyi yapan ve insanların kafasını karıştırmasını önlemek için saklayacağım tek çarpıcı farkla bir komutu da destekler :
- Benzeri bir komut
SHIFT 4, “SHIFT komutuna geçersiz parametre” hata mesajı veren bir hatadır.
SHIFT /nNerede, n0 ile 8 arasında bir tam sayıdır, geçerlidir - ama vardiya değil kez . Bu, bir kez kaydırır ile başlayan n argüman inci. Yani nedenler (beşinci argüman) olmak olmak tek başına 3'e kadar argümanları 0 bırakarak vb, vb.n SHIFT /4%5%4,
%6%5
pushdvepopd).