編寫(xiě)shell腳本時(shí),如果需要在某個(gè)命令執(zhí)行失敗則終止執(zhí)行炉擅,可以使用||
和 &&
運(yùn)算符結(jié)合
# 正常執(zhí)行
cd ~ || exit
# 終止執(zhí)行
cd ~xxxx || exit
echo 'success'
但是想在終止時(shí)輸出一些錯(cuò)誤信息扶平,怎么寫(xiě)?
第一種
cd dir || echo '出錯(cuò)啦' && exit
? 錯(cuò)誤
shell 中運(yùn)算符沒(méi)有優(yōu)先級(jí)渗蟹,從左向右執(zhí)行
當(dāng)cd dir
執(zhí)行成功時(shí),會(huì)執(zhí)行exit
耻陕,cd dir
返回0
拙徽,不會(huì)執(zhí)行|| echo '出錯(cuò)啦'
,但是會(huì)執(zhí)行&& exit
當(dāng)cd dir
執(zhí)行失敗時(shí)诗宣,會(huì)執(zhí)行echo '出錯(cuò)啦'
和exit
所以都會(huì)終止執(zhí)行
第二種
cd dir || (echo '出錯(cuò)啦' && exit)
? 錯(cuò)誤
當(dāng)cd dir
執(zhí)行成功時(shí)膘怕,繼續(xù)執(zhí)行
當(dāng)cd dir
執(zhí)行失敗時(shí),會(huì)執(zhí)行echo '出錯(cuò)啦'
然后繼續(xù)往下執(zhí)行
原因:加了括號(hào)召庞,命令執(zhí)行結(jié)果是括號(hào)內(nèi)的命令執(zhí)行結(jié)果(是否出錯(cuò))岛心,括號(hào)內(nèi)的exit
不會(huì)影響后續(xù)命令的執(zhí)行
正確的代碼
很簡(jiǎn)單
cd dir || ! echo '執(zhí)行出錯(cuò)啦' || exit
這是正解
當(dāng)cd dir
返回非0,會(huì)執(zhí)行! echo '執(zhí)行出錯(cuò)啦'
為什么要加!
篮灼,因?yàn)?echo ''
會(huì)返回0
忘古,加了!
會(huì)讓||
誤認(rèn)為前邊命令執(zhí)行失敗了,所以會(huì)執(zhí)行exit
短路與 &&:前者為真诅诱,才執(zhí)行后邊髓堪;前邊為假,都不執(zhí)行
短路或 ||:前者為真娘荡,后者不執(zhí)行干旁;前者為假,后者執(zhí)行
還有另外一種寫(xiě)法
cd dir
c=$?
if [ $c -ne 0 ]; then
echo '執(zhí)行出錯(cuò)啦'
exit 1
fi
# 好像有點(diǎn)復(fù)雜