帶有 $1 參數的 if 或語句不斷失敗

帶有 $1 參數的 if 或語句不斷失敗

我編寫了以下 bash 腳本來運行漂白位元。

#!/bin/bash

# Use p for preview and c for activating cleaners after script name   
followed by a gap. Example: bb p or bb c.

if  [[ $1 != "p" ]] || [[ $1 != "c" ]] || [[ $# -eq 0 ]]
then    echo 'No, or false parameter selected! Please use p for "preview"     
              or c for "clean"!'
else

# /usr/bin/bleachbit -$1 adobe_reader.cache
/usr/bin/bleachbit -$1 adobe_reader.mru
/usr/bin/bleachbit -$1 adobe_reader.tmp
.
.
.
fi

該腳本名為 bb。無論我只是運行 bb、bb x、bb g、bb c 還是 bb p,我總是收到相同的訊息。

 No, or false parameter selected! Please use p for "preview"     
          or c for "clean"!

實際的漂白位元命令永遠不會執行。我是個新手,所以我很感謝我能在這方面獲得的任何幫助。

答案1

從邏輯上講,您的主要檢查是不可能滿足的:

[[ $1 != "p" ]] || [[ $1 != "c" ]]

因為你有“(not p) OR (not c)”,所以當$1 是“c”時(因為它不是“p”),這將返回TRUE,同樣,當$1 是“p”時,它將返回TRUE(因為它是不是“c”),因此在這兩種情況下您都會收到錯誤訊息。

返回 FALSE 的唯一方法是變數同時保存兩個值同時地,但 Bash 還沒有量子疊加。 (Perl 可能會。)

這可以使用&&(AND) 運算子來代替:

if [[ $1 != "p" ]] && [[ $1 != "c" ]]; then
if [[ $1 != "p" && $1 != "c" ]]; then

為了清楚起見,您可以使用!(NOT) 來翻轉條件:

if ! [[ $1 == "p" || $1 == "c" ]]; then

(這裡參數計數檢查$#是多餘的,所以我刪除了它。)

為了進一步簡化,右側[[支援通配符:

if [[ $1 != [pc] ]]; then

相關內容