Goldilocks' yorum ve insanlığın referanslar tarifine göre
shift
(konumsal parametreler yeniden atar $1
, $2
böylece, vs.) $1
eski değerini alır $2
,
$2
değeri alır $3
, vb *
eski değerini $1
atılır. ( $0
değişmez.) Bunu yapmanın bazı nedenleri şunlardır:
- Onuncu argümana (varsa) daha kolay erişmenizi sağlar.
$10
çalışmaz - $1
bir 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;
for
bunun 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
$1
ve $2
metin dizeleri, süre $3
ve diğer tüm parametreler dosya adlarıdır.
Yani işte nasıl oynandığı. Diyelim ki betiğinizin Patryk_script
ve 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 ostr
için USSR
. İlk shift
ifade, konum parametrelerini aşağıdaki gibi değiştirir:
$1 = Russia
$2 = Treaty1
$3 = Atlas2
$4 = Pravda3
İfadesi nstr="$1"
değişken setleri nstr
için Russia
. İkinci shift
ifade konumsal parametreleri aşağıdaki gibi değiştirir:
$1 = Treaty1
$2 = Atlas2
$3 = Pravda3
Sonra for
döngü değişiklikleri USSR
( $ostr
kadar) Russia
( $nstr
dosyalarda) Treaty1
, Atlas2
ve 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 Atlas2
alıntı değildir ve for
dö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 eval
ve denetlenmeyen bir kullanıcı girişini bir kanala geçirmek eval
tehlikeli 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, sudo
bir 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.tmp
Ve 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 4
neden $5
olmaya $1
,
$6
olmaya $2
vb, 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, shift
Unix 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 /n
Nerede, n
0 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
pushd
vepopd
).