2011-01-28 30 views
62

Có cách nào để thay đổi các đối số dòng lệnh trong tập lệnh Bash hay không. Ví dụ: một tập lệnh Bash được gọi theo cách sau:Thay đổi đối số dòng lệnh trong Bash

./foo arg1 arg2 

Có cách nào thay đổi giá trị của arg1 trong tập lệnh không? Nói, một cái gì đó như

$1="chintz" 

Trả lời

95

Bạn phải đặt lại tất cả đối số. Để thay đổi ví dụ: $3:

$ set -- "${@:1:2}" "new" "${@:4}" 

Về cơ bản bạn settất cả đối số cho giá trị hiện tại của họ, ngoại trừ một (s) mà bạn muốn thay đổi.

Các "${@:1:2}" notation được mở rộng để hai (do đó 2 trong các ký hiệu) đối số vị trí bắt đầu từ bù đắp 1 (ví dụ: $1). Đây là viết tắt của "$1" "$2" trong trường hợp này, nhưng nó hữu ích hơn nhiều khi bạn muốn thay thế, ví dụ: "${17}".

+1

vì vậy, để thay đổi $ 3, tôi cũng phải đổi $ 1 và $ 2, phải không? Và thay đổi chúng thành cái gì? "Reset" nghĩa là gì? – Sriram

+2

Để '$ 1' và' $ 2', tất nhiên. –

+0

+1: Điều đó rất gọn gàng! – Johnsyweb

17

Bạn đang khấm khá hơn gán $1$2 để biến ý nghĩa hơn (Tôi không biết, input_filename = $1output_filename = $2 hoặc một cái gì đó) và sau đó ghi đè lên một trong những biến (input_filename = 'chintz'), bỏ đầu vào cho các kịch bản không thay đổi, trong trường hợp nó là cần thiết ở nơi khác.

+0

Tôi muốn một phương pháp mà tôi có thể thay đổi một trong các đối số đầu vào của chính nó. Tôi cần làm điều đó vì tôi muốn trả lại một giá trị từ kịch bản. Câu trả lời do thkala đề xuất làm việc tốt. Cảm ơn vì sự trả lời!!! – Sriram

+3

@Johnsyweb Đồng ý. Vì lợi ích dễ đọc, bạn là phương pháp tốt hơn. – Dss

Các vấn đề liên quan