Jak opisano komentarz złotowłosa i odniesienia ludzkości,
shiftponownie przypisuje parametry pozycyjne ( $1, $2itp.), Aby $1nabiera starej wartości $2,
$2przyjmuje wartość $3itp. *
Stara wartość $1jest odrzucana. ( $0nie ulega zmianie). Oto niektóre powody:
- Umożliwia łatwiejszy dostęp do dziesiątego argumentu (jeśli taki istnieje).
$10nie działa - jest interpretowane jako $1połączone z 0
(i dlatego może wytworzyć coś takiego Hello0). Po a shiftnastępuje dziesiąty argument $9. (Jednak w większości nowoczesnych powłok możesz użyć ${10}.)
- Jak pokazuje Przewodnik Bash dla początkujących , można go używać do przechodzenia między argumentami. IMNSHO, to jest niezdarne;
forjest do tego znacznie lepszy.
- Podobnie jak w przykładowym skrypcie, ułatwia przetwarzanie wszystkich argumentów w ten sam sposób, z wyjątkiem kilku. Na przykład w skrypcie
$1i $2są ciągami tekstowymi, a $3wszystkie inne parametry są nazwami plików.
Oto jak to się gra. Załóżmy, że twój skrypt jest wywoływany Patryk_scripti nazywa się jako
Patryk_script USSR Russia Treaty1 Atlas2 Pravda3
Skrypt widzi
$1 = USSR
$2 = Russia
$3 = Treaty1
$4 = Atlas2
$5 = Pravda3
Instrukcja ostr="$1"ustawia zmienną ostrna USSR. Pierwsza shiftinstrukcja zmienia parametry pozycyjne w następujący sposób:
$1 = Russia
$2 = Treaty1
$3 = Atlas2
$4 = Pravda3
Instrukcja nstr="$1"ustawia zmienną nstrna Russia. Druga shiftinstrukcja zmienia parametry pozycyjne w następujący sposób:
$1 = Treaty1
$2 = Atlas2
$3 = Pravda3
A następnie forzmiany loop USSR( $ostr) do Russia( $nstr) w plikach Treaty1, Atlas2oraz Pravda3.
Istnieje kilka problemów ze skryptem.
dla pliku w $ @; zrobić
Jeśli skrypt zostanie wywołany jako
Patryk_script ZSRR Rosja Traktat1 „Atlas świata2” Prawda3
to widzi
1 USD = ZSRR
2 USD = Rosja
3 USD = Traktat 1
4 USD = Atlas Świata 2
5 USD = Pravda3
ale, ponieważ $@nie jest cytowany, przestrzeń w World Atlas2nie jest cytowany, a forpętla myśli, że ma cztery pliki: Treaty1, World, Atlas2i Pravda3. Tak powinno być
dla pliku w „$ @”; zrobić
(aby zacytować dowolne znaki specjalne w argumentach) lub po prostu
do pliku do
(co odpowiada dłuższej wersji).
eval "sed 's /" $ ostr "/" $ nstr "/ g' $ file"
Nie ma takiej potrzeby eval, a przekazywanie niepotwierdzonych danych wejściowych do użytkownika evalmoże być niebezpieczne. Na przykład, jeśli skrypt jest wywoływany jako
Patryk_script "'; rm *;'" Rosja Traktat1 Atlas2 Prawda3
wykona się rm *! Jest to duży problem, jeśli skrypt można uruchomić z uprawnieniami wyższymi niż uprawnienia użytkownika, który go wywołuje; np. jeśli można go uruchomić sudolub wywołać z interfejsu sieciowego. Prawdopodobnie nie jest to tak ważne, jeśli po prostu używasz go jako siebie, w swoim katalogu. Ale można to zmienić na
sed "s / $ ostr / $ nstr / g" "$ file"
Wciąż wiąże się to z pewnym ryzykiem, ale są one znacznie mniej dotkliwe.
if [ -f $file ], > $file.tmpI mv $file.tmp $file
powinna być if [ -f "$file" ], > "$file.tmp"i mv "$file.tmp" "$file", odpowiednio, do obsługi nazw plików, które mogą mieć spacji (lub innych znaków śmieszne) w nich. ( eval "sed …Polecenie zmienia także nazwy plików ze spacjami).
* shift przyjmuje opcjonalny argument: dodatnia liczba całkowita, która określa liczbę parametrów do przesunięcia. Domyślna wartość to jeden ( 1). Na przykład shift 4powoduje , że $5
się staje $1,
$6staje się $2itd. (Zauważ, że przykład w Bash Guide dla początkujących jest błędny.) Tak więc twój skrypt może zostać zmodyfikowany tak, by powiedział
ostr="$1"
nstr="$2"
shift 2
co można uznać za bardziej jasne.
Uwaga końcowa / ostrzeżenie:
Język wiersza poleceń systemu Windows (plik wsadowy) obsługuje także SHIFTpolecenie, które działa w zasadzie tak samo jak shiftpolecenie w powłokach uniksowych, z jedną uderzającą różnicą, którą ukryję, aby zapobiec pomyłkom ludzi:
- Polecenie podobne
SHIFT 4jest błędem, co powoduje wyświetlenie komunikatu o błędzie „Nieprawidłowy parametr polecenia SHIFT”.
SHIFT /n, gdzie njest liczbą całkowitą od 0 do 8, jest poprawna - ale nie zmienia czasów . Przesuwa się raz, zaczynając od n- tego argumentu. To powoduje, że (piąty argument) staje się itd., Pozostawiając argumenty od 0 do 3 w spokoju.n SHIFT /4%5%4,
%6%5
pushdipopd).