Seperti yang dijelaskan oleh komentar goldilocks dan referensi kemanusiaan,
shifttetapkan kembali parameter posisi ( $1,, $2dll.) Sehingga $1mengambil nilai lama $2,
$2mengambil nilai $3, dll. *
Nilai lama $1dibuang. ( $0tidak diubah.) Beberapa alasan untuk melakukan ini termasuk:
- Ini memungkinkan Anda mengakses argumen kesepuluh (jika ada) dengan lebih mudah.
$10tidak berfungsi - ini diartikan sebagai $1digabungkan dengan 0
(dan mungkin menghasilkan sesuatu seperti Hello0). Setelah a shift, argumen kesepuluh menjadi $9. (Namun, di sebagian besar shell modern, Anda dapat menggunakan ${10}.)
- Seperti yang diperlihatkan oleh Bash Guide for Beginners , Bash Guide dapat digunakan untuk mengulang argumen. IMNSHO, ini canggung;
forjauh lebih baik untuk itu.
- Seperti pada skrip contoh Anda, memudahkan untuk memproses semua argumen dengan cara yang sama kecuali beberapa. Misalnya, dalam skrip Anda,
$1dan $2merupakan string teks, sementara $3dan semua parameter lainnya adalah nama file.
Jadi begini caranya. Misalkan skrip Anda dipanggil Patryk_scriptdan disebut sebagai
Patryk_script USSR Russia Treaty1 Atlas2 Pravda3
Script melihat
$1 = USSR
$2 = Russia
$3 = Treaty1
$4 = Atlas2
$5 = Pravda3
Pernyataan ostr="$1"mengatur variabel ostrmenjadi USSR. shiftPernyataan pertama mengubah parameter posisi sebagai berikut:
$1 = Russia
$2 = Treaty1
$3 = Atlas2
$4 = Pravda3
Pernyataan nstr="$1"mengatur variabel nstrmenjadi Russia. shiftPernyataan kedua mengubah parameter posisi sebagai berikut:
$1 = Treaty1
$2 = Atlas2
$3 = Pravda3
Dan kemudian forperubahan lingkaran USSR( $ostr) ke Russia( $nstr) dalam file Treaty1, Atlas2dan Pravda3.
Ada beberapa masalah dengan skrip.
untuk file dalam $ @; melakukan
Jika skrip dipanggil sebagai
Patryk_script USSR Russia Treaty1 "World Atlas2" Pravda3
ia melihat
$ 1 = USSR
$ 2 = Rusia
$ 3 = Perjanjian1
$ 4 = World Atlas2
$ 5 = Pravda3
namun, karena $@tidak dikutip, ruang di World Atlas2tidak dikutip, dan forlingkaran berpikir itu memiliki empat file: Treaty1, World, Atlas2, dan Pravda3. Ini juga harus
untuk file dalam "$ @"; melakukan
(Mengutip karakter khusus dalam argumen) atau secara sederhana
untuk file lakukan
(yang setara dengan versi yang lebih panjang).
eval "sed / s /" $ ostr "/" $ nstr "/ g '$ file"
Ini tidak perlu menjadi eval, dan meneruskan input pengguna yang tidak dicentang ke evalbisa berbahaya. Misalnya, jika skrip dipanggil sebagai
Patryk_script "'; rm *;'" Russia Treaty1 Atlas2 Pravda3
itu akan mengeksekusi rm *! Ini adalah masalah besar jika skrip dapat dijalankan dengan hak istimewa lebih tinggi dari pada pengguna yang memintanya; misalnya, jika dapat dijalankan melalui sudoatau dipanggil dari antarmuka web. Ini mungkin tidak begitu penting jika Anda hanya menggunakannya sebagai diri sendiri, di direktori Anda. Tapi itu bisa diubah menjadi
sed "s / $ ostr / $ nstr / g" "$ file"
Ini masih memiliki beberapa risiko, tetapi mereka jauh lebih ringan.
if [ -f $file ], > $file.tmpdan mv $file.tmp $file
harus if [ -f "$file" ], > "$file.tmp"dan mv "$file.tmp" "$file", masing-masing, untuk menangani nama file yang mungkin memiliki spasi (atau karakter lucu lainnya) di dalamnya. ( eval "sed …Perintah juga mangles nama file yang memiliki spasi di dalamnya.)
* shift mengambil argumen opsional: bilangan bulat positif yang menentukan berapa banyak parameter yang bergeser. Standarnya adalah satu ( 1). Misalnya, shift 4menyebabkan $5
menjadi $1,
$6menjadi $2, dan seterusnya. (Perhatikan bahwa contoh dalam Bash Guide for Beginners salah.) Dan skrip Anda dapat dimodifikasi untuk mengatakan
ostr="$1"
nstr="$2"
shift 2
yang mungkin dianggap lebih jelas.
Catatan Akhir / Peringatan:
Bahasa Windows Command Prompt (file batch) juga mendukung SHIFTperintah, yang pada dasarnya melakukan hal yang sama dengan shiftperintah di shell Unix, dengan satu perbedaan mencolok, yang akan saya sembunyikan untuk mencegah orang-orang menjadi bingung olehnya:
- Perintah like
SHIFT 4adalah kesalahan, menghasilkan pesan kesalahan “Parameter tidak valid ke perintah SHIFT”.
SHIFT /n, di mana nbilangan bulat antara 0 dan 8, valid - tetapi tidak bergeser kali . Ini menggeser sekali, dimulai dengan yang n th argumen. Jadi menyebabkan (argumen kelima) menjadi , dan seterusnya, meninggalkan argumen 0 hingga 3 saja.n SHIFT /4%5%4,
%6%5
pushddanpopd).