Bash

Bash IF 語句未按預期執行

  • November 28, 2022

我無法理解這個簡單的 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”?那該用什麼?對於警告和極端情況。

引用自:https://unix.stackexchange.com/questions/726576