Seperti yang dijelaskan oleh komentar goldilocks dan referensi kemanusiaan,
shift
tetapkan kembali parameter posisi ( $1
,, $2
dll.) Sehingga $1
mengambil nilai lama $2
,
$2
mengambil nilai $3
, dll. *
Nilai lama $1
dibuang. ( $0
tidak diubah.) Beberapa alasan untuk melakukan ini termasuk:
- Ini memungkinkan Anda mengakses argumen kesepuluh (jika ada) dengan lebih mudah.
$10
tidak berfungsi - ini diartikan sebagai $1
digabungkan 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;
for
jauh lebih baik untuk itu.
- Seperti pada skrip contoh Anda, memudahkan untuk memproses semua argumen dengan cara yang sama kecuali beberapa. Misalnya, dalam skrip Anda,
$1
dan $2
merupakan string teks, sementara $3
dan semua parameter lainnya adalah nama file.
Jadi begini caranya. Misalkan skrip Anda dipanggil Patryk_script
dan 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 ostr
menjadi USSR
. shift
Pernyataan pertama mengubah parameter posisi sebagai berikut:
$1 = Russia
$2 = Treaty1
$3 = Atlas2
$4 = Pravda3
Pernyataan nstr="$1"
mengatur variabel nstr
menjadi Russia
. shift
Pernyataan kedua mengubah parameter posisi sebagai berikut:
$1 = Treaty1
$2 = Atlas2
$3 = Pravda3
Dan kemudian for
perubahan lingkaran USSR
( $ostr
) ke Russia
( $nstr
) dalam file Treaty1
, Atlas2
dan 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 Atlas2
tidak dikutip, dan for
lingkaran 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 eval
bisa 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 sudo
atau 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.tmp
dan 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 4
menyebabkan $5
menjadi $1
,
$6
menjadi $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 SHIFT
perintah, yang pada dasarnya melakukan hal yang sama dengan shift
perintah di shell Unix, dengan satu perbedaan mencolok, yang akan saya sembunyikan untuk mencegah orang-orang menjadi bingung olehnya:
- Perintah like
SHIFT 4
adalah kesalahan, menghasilkan pesan kesalahan “Parameter tidak valid ke perintah SHIFT”.
SHIFT /n
, di mana n
bilangan 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
pushd
danpopd
).