Làm cách nào để thay đổi giá trị của một đối số trong tập lệnh?


11

Tôi đã thử đoạn script đơn giản nhỏ sau đây:

#!/bin/bash
$1="bar"
echo $1

Nhưng khi tôi chạy, ./script footôi gặp lỗi và giá trị không thay đổi:

/home/mika/script: line 2: foo=bar: command not found
foo

Tôi biết $ 1 là đối số đầu tiên bạn chuyển đến tập lệnh của mình. Nhưng ngay cả như thế này tôi muốn thay đổi giá trị của nó.


Câu trả lời:


10

Bạn có thể sử dụng nội dung set:

#!/bin/bash
set -- "bar"
echo $1

Nguồn và nhiều hơn về: Thay đổi một đối số dòng lệnh - bash .


Tôi đã thử nó, nhưng nó vẫn lặp lại "foo". Bạn đã nhận được kết quả khác nhau? Hãy chắc chắn để chuyển "foo" cho kịch bản.
Marty Fried

@MartyFried Ups, xin lỗi ... tôi chỉ cập nhật câu trả lời của tôi.
Radu Rădeanu

Điều đó làm việc. :-) Câu trả lời hay ... Tôi nghĩ rằng tôi đã cho rằng anh ta không muốn làm điều đó, và tôi không chắc tại sao anh ta lại làm vậy, nhưng câu trả lời của bạn thực sự đúng hơn đề nghị của tôi chỉ đơn giản là không làm điều đó. Cảm ơn các liên kết.
Marty Fried

4

Bạn không thể thay đổi các biến đó trực tiếp. Bạn có thể nói:

x=$1
echo $x

Sau đó, bạn có thể sử dụng $xthay thế

Việc sử dụng $1=barsẽ ngay lập tức thay thế tham số đầu tiên cho $1, và về cơ bản bạn đang nêu rõ "foo=bar"và nó được hiểu là một lệnh "foo", không phải là một biến "foo";


Ý tưởng hay, nhưng phụ thuộc chính xác những gì OP muốn thực hiện ... +1 từ tôi.
Radu Rădeanu

2

Không sử dụng sử dụng $1cho điều này, trong bashvà các shell khác, $1là đối số đầu tiên bạn chuyển đến tập lệnh của mình:

#!/bin/bash
echo $1

Nếu bạn chạy như trên foo.sh hello, nó sẽ in hellovì đó là đối số thứ nhất. Ngoài ra, bạn đề cập đến một biến như varnội dung của một biến là $var. Vì vậy, để có được hành vi mà bạn mong đợi, chỉ cần sử dụng tên khác cho biến của bạn và không sử dụng $:

#!/bin/bash
var="bar"
echo $var

Kịch bản nhỏ này chỉ là một ví dụ để khiến mọi người hiểu tôi muốn gì. Tôi biết $ 1 là đối số đầu tiên bạn chuyển đến tập lệnh của mình. Nhưng, ngay cả như thế này tôi muốn thay đổi giá trị của nó. Tôi cần phải áp dụng điều này trong một kịch bản lớn khác. Cảm ơn bạn.
dùng258266

@ user258266 không. Chỉ cần gọi tập lệnh lớn với giá trị mới, không sử dụng $1cho các giá trị mà bạn muốn thay đổi. Dù sao, miễn là bạn sửa lỗi cú pháp, nó sẽ hoạt động, vấn đề chính của bạn là bạn đang sử dụng $.
terdon

Nhưng tôi cần ... Tôi không thể giải thích ở đây tại sao ... Có lẽ tôi sẽ chỉnh sửa câu hỏi của mình.
dùng258266

@ user258266 vui lòng làm. Bạn đang cố gắng đặt một biến là $foo="bar", nó không hoạt động, bạn cần foo="bar"mà không có $.
terdon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.