Bash's return()
chỉ có thể trả về các đối số số. Trong mọi trường hợp, theo mặc định, nó sẽ trả về trạng thái thoát của lệnh chạy cuối cùng. Vì vậy, tất cả những gì bạn thực sự cần là:
#!/usr/bin/env bash
install_auto() {
apt-get -h > /dev/null 2>&1
if [ $? -eq 0 ] ; then
sudo apt-get install --assume-yes $@
fi
}
Bạn không cần phải thiết lập một giá trị được trả về một cách rõ ràng vì theo mặc định, một hàm sẽ trả về $?
. Tuy nhiên, điều đó sẽ không hoạt động nếu apt
lệnh đầu tiên thất bại và bạn không đi vào if
vòng lặp. Để làm cho nó mạnh mẽ hơn, sử dụng này:
#!/usr/bin/env bash
install_auto() {
apt-get -h > /dev/null 2>&1
ret=$?
if [ $ret -eq 0 ] ; then
## If this is executed, the else is ignored and $? will be
## returned. Here, $?will be the exit status of this command
sudo apt-get install --assume-yes $@
else
## Else, return the exit value of the first apt-get
return $ret
fi
}
Nguyên tắc chung là để có một hàm trả về trạng thái thoát của một công việc cụ thể và không nhất thiết là công việc cuối cùng mà nó đã chạy, bạn sẽ cần lưu trạng thái thoát vào một biến và trả về biến:
function foo() {
run_a_command arg1 arg2 argN
## Save the command's exit status into a variable
return_value= $?
[the rest of the function goes here]
## return the variable
return $return_value
}
EDIT: Trên thực tế, như @gniourf_gniourf đã chỉ ra trong các bình luận, bạn có thể đơn giản hóa rất nhiều toàn bộ bằng cách sử dụng &&
:
install_auto() {
apt-get -h > /dev/null 2>&1 &&
sudo apt-get install --assume-yes $@
}
Giá trị trả về của hàm này sẽ là một trong:
- Nếu
apt-get -h
thất bại, nó sẽ trả về mã thoát của nó
- Nếu
apt-get -h
thành công, nó sẽ trả về mã thoát của sudo apt-get install
.
return $?
vào dòng tiếp theo của ví dụ của bạn sausudo apt-get ...
có thể là đủ. Có đúng không? Cảm ơn