Bash
Bash IF 語句未按預期執行
我無法理解這個簡單的 Bash 腳本的邏輯:
#!/bin/bash # Check if file is present which ./vendor/bin/non_existent_file &> /dev/null printf "Exited with $?\n\n" if [[ "$?" -eq 1 ]]; then echo "Number is One" else echo "Number is not one" fi
當文件失去(不存在)時,輸出是這樣的:
Exited with 1 Number is not one
當文件存在時,輸出是這樣的:
Exited with 0 Number is not one
???
我嘗試過的事情:
if [ $? == 1 ] if [ "$?" == 1 ] if [[ "$?" == 1 ]] if [[ $? -eq 1 ]] if [[ "$?" = "1" ]] if [[ "$?" == "1" ]]
為什麼 IF 語句總是失敗?
which ./vendor/bin/non_existent_file &> /dev/null
這將執行
which
並設置$?
為退出狀態。(我現在假設這which
對你有用。)printf "Exited with $?\n\n"
這將執行
printf
,並設置$?
為退出狀態。if [[ "$?" -eq 1 ]]; then
所以測試的是 .exit 的退出狀態
printf
。您需要將退出狀態保存到一個臨時變數中以避免這種情況,例如
which ./vendor/bin/non_existent_file &> /dev/null ret=$? printf 'which exited with status %d\n' "$ret" if [[ $ret -ne 0 ]]; then printf "that was a falsy exit status" fi
雖然
which
我知道會搜尋PATH
命名的執行檔,但如果您有一個固定的路徑,您正在查看,您可能可以[[ -x ./path ]]
直接使用來查看該文件是否執行檔。如果您正在尋找一個程序PATH
,您可能想看看為什麼不使用“which”?那該用什麼?對於警告和極端情況。