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ả,
shift
gán lại các tham số vị trí ( $1
, $2
v.v.) để $1
lấy giá trị cũ của $2
,
$2
lấy giá trị của $3
, v.v. *
Giá trị cũ của $1
bị loại bỏ. ( $0
khô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.
$10
không hoạt động - nó được hiểu là $1
nố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ề;
for
tố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
$1
và $2
là các chuỗi văn bản, trong khi $3
và 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_script
và 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 ostr
thành USSR
. Câu shift
lệ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 nstr
thành Russia
. Câu shift
lệnh thứ hai thay đổi các tham số vị trí như sau:
$1 = Treaty1
$2 = Atlas2
$3 = Pravda3
Và sau đó for
thay đổi vòng lặp USSR
( $ostr
) để Russia
( $nstr
) trong các tập tin Treaty1
, Atlas2
và 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 Atlas2
không trích dẫn, và các for
vò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 eval
có 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 sudo
hoặ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.tmp
Và 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 4
nguyên nhân $5
để trở thành $1
,
$6
trở 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 SHIFT
lệnh, về cơ bản giống như shift
lệ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 4
là 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 đó n
mộ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
pushd
vàpopd
).