带有 $1 个参数的 if 或语句不断失败

带有 $1 个参数的 if 或语句不断失败

我编写了以下 bash 脚本来运行 bleachbit。

#!/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"!

实际的 bleachbit 命令从未执行。我是个新手,因此我非常感谢任何能在这方面提供的帮助。

答案1

您的主要检查在逻辑上是不可能满足的:

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

因为您有“(not p) OR (not c)”,所以当 $1 为“c”(因为它不是“p”)时,它将返回 TRUE,同样,当 $1 为“p”(因为它不是“c”)时,它将返回 TRUE,因此在两种情况下您都会收到错误消息。

它返回 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

相关内容