Không có khái niệm về một biến boolean trong shell.
Các biến Shell chỉ có thể là text
(một chuỗi) và, trong một số trường hợp, văn bản đó có thể được hiểu là một số nguyên ( 1
,0xa
, 010
, vv).
Do đó, một flag=true
ngụ ý không có sự trung thực hoặc giả dối cho vỏ.
Chuỗi
Những gì có thể được thực hiện là so sánh chuỗi [ "$flag" == "true" ]
hoặc sử dụng nội dung biến trong một số lệnh và kiểm tra hậu quả của nó , như thực thi true
(vì có cả lệnh thực thi được gọi true
và false
lệnh được gọi ) như một lệnh và kiểm tra xem mã thoát của lệnh đó có bằng không (thành công).
$flag; if [ "$?" -eq 0 ]; then ... fi
Hoặc ngắn hơn:
if "$flag"; then ... fi
Nếu nội dung của một biến được sử dụng như một lệnh, thì !
có thể được sử dụng để phủ định trạng thái thoát của lệnh, nếu một khoảng trắng tồn tại giữa cả hai ( ! cmd
), như trong:
if ! "$flag"; then ... fi
Kịch bản sẽ thay đổi thành:
flag=false
while ! "$flag"
do
read x
if [ "$x" == "true" ]
then
flag=true
fi
echo "${x} : ${flag}"
done
Số nguyên
Sử dụng các giá trị số và mở rộng số học .
Trong trường hợp này, mã thoát $((0))
là 1
và mã thoát $((1))
là 0
.
Trong bash, ksh và zsh số học có thể được thực hiện bên trong một ((..))
(lưu ý rằng bắt đầu $
bị thiếu).
flag=0; if ((flag)); then ... fi
Một phiên bản di động của mã này là phức tạp hơn:
flag=0; if [ "$((flag))" -eq 0 ]; then ... fi # test for a number
flag=0; if [ "$((flag))" == 0 ]; then ... fi # test for the string "0"
Trong bash / ksh / zsh bạn có thể làm:
flag=0
while ((!flag))
do
read x
[ "$x" == "true" ] && flag=1
echo "${x} : ${flag}"
done
Hoặc
Bạn có thể "Đảo ngược một biến boolean" (miễn là nó chứa một giá trị số) là:
((flag=!flag))
Điều đó sẽ thay đổi giá trị của flag
một trong hai 0
hoặc 1
.
Lưu ý : Vui lòng kiểm tra lỗi trong https://www.shellcheck.net/ trước khi đăng mã của bạn dưới dạng câu hỏi, nhiều lần là đủ để tìm ra vấn đề.