ไม่มีแนวคิดของตัวแปรบูลีนในเชลล์
ตัวแปรเชลล์เท่านั้นอาจจะtext
(สตริง) และในบางกรณีข้อความที่อาจถูกตีความว่าเป็นจำนวนเต็ม ( 1
, 0xa
, 010
ฯลฯ )
ดังนั้นการสื่อความflag=true
หมายจึงไม่มีความจริงหรือความผิดพลาดต่อเชลล์เลย
เชือก
สิ่งที่สามารถทำได้คือการเปรียบเทียบสตริง[ "$flag" == "true" ]
หรือใช้เนื้อหาตัวแปรในบางคำสั่งและตรวจสอบผลของมันเช่นดำเนินการtrue
(เพราะมีทั้งเรียกใช้งานได้เรียกtrue
และหนึ่งเรียกว่าfalse
) เป็นคำสั่งและตรวจสอบว่ารหัสทางออกของคำสั่งนั้นเป็นศูนย์ (ที่ประสบความสำเร็จ)
$flag; if [ "$?" -eq 0 ]; then ... fi
หรือสั้นกว่า:
if "$flag"; then ... fi
หากเนื้อหาของตัวแปรถูกใช้เป็นคำสั่ง a !
สามารถใช้เพื่อลบล้างสถานะการออกของคำสั่งหากมีช่องว่างระหว่างทั้งสอง ( ! cmd
) ดังใน:
if ! "$flag"; then ... fi
สคริปต์ควรเปลี่ยนเป็น:
flag=false
while ! "$flag"
do
read x
if [ "$x" == "true" ]
then
flag=true
fi
echo "${x} : ${flag}"
done
จำนวนเต็ม
ใช้ค่าตัวเลขและเลขคณิตขยาย
ในกรณีนี้รหัสทางออกของ$((0))
เป็น1
และรหัสทางออกของมี$((1))
ใน bash, ksh และ zsh สามารถดำเนินการทางคณิตศาสตร์ภายใน(โปรดทราบว่าการเริ่มต้นหายไป)0
((..))
$
flag=0; if ((flag)); then ... fi
รหัสพกพารุ่นนี้มีความซับซ้อนมากขึ้น:
flag=0; if [ "$((flag))" -eq 0 ]; then ... fi # test for a number
flag=0; if [ "$((flag))" == 0 ]; then ... fi # test for the string "0"
ใน bash / ksh / zsh คุณสามารถทำได้:
flag=0
while ((!flag))
do
read x
[ "$x" == "true" ] && flag=1
echo "${x} : ${flag}"
done
อีกทางเลือกหนึ่ง
คุณสามารถ "สลับตัวแปรบูลีน" (โดยมีค่าเป็นตัวเลข) ดังนี้:
((flag=!flag))
ที่จะเปลี่ยนค่าของflag
อย่างใดอย่างหนึ่งหรือ0
1
หมายเหตุ : โปรดตรวจสอบข้อผิดพลาดในhttps://www.shellcheck.net/ก่อนที่จะโพสต์รหัสของคุณเป็นคำถามหลายครั้งที่เพียงพอที่จะพบปัญหา