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ế 2trong 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 $1và $2cho các biến có ý nghĩa hơn (tôi không biết input_filename = $1và output_filename = $2hoặ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.