Có cách nào để thay đổi các đối số dòng lệnh trong tập lệnh Bash. Ví dụ: giả sử một tập lệnh Bash được gọi theo cách sau:
./foo arg1 arg2
Có cách nào để thay đổi giá trị của arg1 trong script không? Nói, một cái gì đó như
$1="chintz"
Câu trả lời:
Bạn phải đặt lại tất cả các đối số. Để thay đổi ví dụ $3
:
$ set -- "${@:1:2}" "new" "${@:4}"
Về cơ bản, bạn đặt tất cả các đối số thành giá trị hiện tại của chúng, ngoại trừ (các) đối số mà bạn muốn thay đổi. set --
cũng được chỉ định bởi POSIX 7 .
Các "${@:1:2}"
ký hiệu được mở rộng để hai (vì thế 2
trong các ký hiệu) đối số vị trí bắt đầu từ bù đắp 1
(tức $1
). Nó là cách viết tắt "$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}"
.
Tối ưu hóa tính dễ đọc và khả năng bảo trì, bạn có thể tốt hơn nên chỉ định $1
và $2
cho các biến có ý nghĩa hơn (tôi không biết input_filename = $1
và output_filename = $2
hoặc điều gì đó) và sau đó ghi đè một trong các biến đó ( input_filename = 'chintz'
), giữ nguyên đầu vào cho tập lệnh, trong trường hợp cần thiết ở nơi khác.