Như nhận xét của Goldilocks và các tài liệu tham khảo của nhân loại mô tả,
shiftgán lại các tham số vị trí ( $1, $2v.v.) để $1lấy giá trị cũ của $2,
$2lấy giá trị của $3, v.v. *
Giá trị cũ của $1bị loại bỏ. ( $0không thay đổi.) Một số lý do để thực hiện việc này bao gồm:
- Nó cho phép bạn truy cập đối số thứ mười (nếu có) một cách dễ dàng hơn.
$10không hoạt động - nó được hiểu là $1nối với một 0
(và do đó có thể tạo ra một cái gì đó như Hello0). Sau một shift, đối số thứ mười trở thành $9. (Tuy nhiên, trong hầu hết các shell hiện đại, bạn có thể sử dụng ${10}.)
- Như Hướng dẫn Bash cho người mới bắt đầu chứng minh, nó có thể được sử dụng để lặp qua các đối số. IMNSHO, điều này thật vụng về;
fortốt hơn nhiều cho điều đó.
- Như trong kịch bản ví dụ của bạn, nó giúp dễ dàng xử lý tất cả các đối số theo cùng một cách trừ một số ít. Ví dụ: trong tập lệnh của bạn
$1và $2là các chuỗi văn bản, trong khi $3và tất cả các tham số khác là tên tệp.
Vì vậy, đây là cách nó diễn ra. Giả sử tập lệnh của bạn được gọi Patryk_scriptvà nó được gọi là
Patryk_script USSR Russia Treaty1 Atlas2 Pravda3
Kịch bản thấy
$1 = USSR
$2 = Russia
$3 = Treaty1
$4 = Atlas2
$5 = Pravda3
Câu lệnh ostr="$1"đặt biến ostrthành USSR. Câu shiftlệnh đầu tiên thay đổi các tham số vị trí như sau:
$1 = Russia
$2 = Treaty1
$3 = Atlas2
$4 = Pravda3
Câu lệnh nstr="$1"đặt biến nstrthành Russia. Câu shiftlệnh thứ hai thay đổi các tham số vị trí như sau:
$1 = Treaty1
$2 = Atlas2
$3 = Pravda3
Và sau đó forthay đổi vòng lặp USSR( $ostr) để Russia( $nstr) trong các tập tin Treaty1, Atlas2và Pravda3.
Có một vài vấn đề với kịch bản.
cho tệp trong $ @; làm
Nếu tập lệnh được gọi là
Patryk_script Hiệp ước Liên Xô Nga1 "World Atlas2" Pravda3
nó thấy
$ 1 = Liên Xô
$ 2 = Nga
$ 3 = Hiệp ước1
$ 4 = Thế giới Atlas2
$ 5 = Pravda3
nhưng, vì $@không được trích dẫn, không gian trong World Atlas2không trích dẫn, và các forvòng lặp nghĩ nó có bốn tập tin: Treaty1, World, Atlas2, và Pravda3. Điều này nên là một trong hai
cho tệp trong "$ @"; làm
(để trích dẫn bất kỳ ký tự đặc biệt nào trong các đối số) hoặc đơn giản là
cho tập tin làm
(tương đương với phiên bản dài hơn).
eval "sed 's /" $ lasr "/" $ nstr "/ g' $ file"
Không cần điều này là một eval, và chuyển đầu vào của người dùng không được kiểm soát sang một evalcó thể nguy hiểm. Ví dụ: nếu tập lệnh được gọi là
Patryk_script "'; rm *;'" Hiệp ước Nga1 Atlas2 Pravda3
nó sẽ thực thi rm *! Đây là một mối quan tâm lớn nếu tập lệnh có thể được chạy với các đặc quyền cao hơn so với những người dùng gọi nó; ví dụ: nếu nó có thể được chạy qua sudohoặc được gọi từ giao diện web. Nó có thể không quá quan trọng nếu bạn chỉ sử dụng nó như chính mình, trong thư mục của bạn. Nhưng nó có thể được thay đổi thành
sed "s / $ lasr / $ nstr / g" "$ file"
Điều này vẫn có một số rủi ro, nhưng chúng ít nghiêm trọng hơn nhiều.
if [ -f $file ], > $file.tmpVà mv $file.tmp $file
nên if [ -f "$file" ], > "$file.tmp"và mv "$file.tmp" "$file", tương ứng, để xử lý tên tập tin mà có thể có các khoảng trống (hoặc nhân vật hài hước khác) trong đó. ( eval "sed …Lệnh cũng mang tên tệp có không gian trong đó.)
* shift lấy một đối số tùy chọn: một số nguyên dương xác định số lượng tham số cần dịch chuyển. Mặc định là một ( 1). Ví dụ, shift 4nguyên nhân $5
để trở thành $1,
$6trở thành $2, và như vậy. (Lưu ý rằng ví dụ trong Hướng dẫn Bash cho người mới bắt đầu là sai.) Và do đó, tập lệnh của bạn có thể được sửa đổi để nói
ostr="$1"
nstr="$2"
shift 2
mà có thể được coi là rõ ràng hơn.
Lưu ý cuối / Cảnh báo:
Ngôn ngữ Windows Command Prompt (tệp bó) cũng hỗ trợ một SHIFTlệnh, về cơ bản giống như shiftlệnh trong shell Unix, với một điểm khác biệt nổi bật, tôi sẽ ẩn để cố gắng ngăn mọi người khỏi bị nhầm lẫn bởi nó:
- Một lệnh giống như
SHIFT 4là một lỗi, mang lại một tham số không hợp lệ cho lệnh SHift thông báo lỗi lỗi.
SHIFT /n, trong đó nmột số nguyên nằm trong khoảng từ 0 đến 8, là hợp lệ - nhưng nó không thay đổi thời gian . Nó thay đổi một lần, bắt đầu với các n tranh luận thứ. Vì vậy, làm cho (đối số thứ năm) trở thành trở thành , và cứ thế, để lại các đối số 0 đến 3.n SHIFT /4%5%4,
%6%5
pushdvàpopd).