Lý do duy nhất khiến bạn muốn sử dụng $?
làm đối số cho [
lệnh (cho dù [
lệnh đó có được chạy trong phần điều kiện của if
câu lệnh hay không) là khi bạn muốn phân biệt đối xử về trạng thái trả về cụ thể, như:
until
cmd
[ "$?" -gt 1 ]
do
something
done
Cú pháp cho tất cả những if
, while
, until
... báo cáo là
if cmd-list1
then cmd-list2
else cmd-list3
fi
Mà chạy cmd-list2
nếu cmd-list1
thành công hoặc cmd-list3
cách khác.
Các [ "$?" -eq 0 ]
lệnh là một không-op. Nó đặt $?
thành 0 nếu $?
là 0 và $?
khác không nếu nó khác không.
Nếu bạn muốn chạy một cái gì đó nếu cmd
thất bại, đó là:
if ! cmd
then ...
fi
Nói chung, bạn không cần phải tự mày mò $?
để biết giá trị nào có nghĩa là true
hay false
. Các trường hợp duy nhất như tôi đã nói ở trên nếu bạn cần phân biệt đối xử trên một giá trị cụ thể hoặc nếu bạn cần lưu nó sau này (ví dụ để trả về nó dưới dạng giá trị trả về của hàm) như:
f() {
cmd; ret=$?
some cleanup
return "$ret"
}
Cũng cần nhớ rằng để lại một biến không được trích dẫn là toán tử split + global. Sẽ không có ý nghĩa khi gọi toán tử đó ở đây, vì vậy nó phải là:
[ "$?" -ne 0 ]
không [ $? -ne 0 ]
, hãy để một mình [$? -ne 0 ]
(mà sẽ chỉ gọi [
lệnh nếu $IFS
tình cờ có chứa ký tự đầu tiên của $?
).
Cũng lưu ý rằng cách Bourne để xác định hàm là dán function-name()
trước lệnh. Đó là trường hợp trong mọi Bourne như shell ngoại trừ bash
và yash
(và các phiên bản gần đây của posh
) chỉ cho phép một lệnh ghép (các lệnh ghép là {...}
hoặc (...)
hoặc những thứ như for...done
, if...fi
...
function foo { ... }
là ksh
cú pháp định nghĩa hàm. Không có lý do tại sao bạn muốn sử dụng nó ở đây.
Mã của bạn có thể được viết (POSIXly) bằng văn bản:
foo() (
cd -P -- "$FOOBAR" || return # what if the cd failed!
if
<some command>
then
echo 'OK!'
else
echo 'Nope!'
fi
)
Cũng lưu ý rằng cd
không -P
có ý nghĩa rất đặc biệt (xử lý các đường dẫn có chứa ..
các thành phần khác với bất kỳ lệnh nào khác), vì vậy tốt hơn là đưa nó vào tập lệnh để tránh nhầm lẫn.
(hàm đó trả về false
nếu cd
thất bại, nhưng không phải nếu <some command>
thất bại).
$?
bằng 0 với mộtif
câu lệnh là vô nghĩa,if
mong đợi một lệnh và nếu lệnh được trả về0
, nó sẽ chạy mã trong khối. vì vậyif true; then echo hello; fi
sẽ vang xin chào kể từ khi lệnhtrue
trở lại0
.