Оператор If или с параметрами $1 продолжает давать сбой

Оператор If или с параметрами $1 продолжает давать сбой

Я написал следующий 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" ]]

Поскольку у вас есть «(не p) ИЛИ (не c)», это вернет ИСТИНА, когда $1 равно «c» (потому что это не «p»), и аналогично это вернет ИСТИНА, когда $1 равно «p» (потому что это не «c»), и поэтому вы получите сообщение об ошибке в обоих случаях.

Единственный способ вернуть FALSE — это если переменная содержит оба значенияодновременно, но в Bash пока нет квантовых суперпозиций. (Возможно, в Perl.)

Это будет работать с &&оператором (AND):

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

Для ясности можно использовать !(НЕ), чтобы перевернуть условие:

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

(Проверка количества параметров $# здесь лишняя, поэтому я ее удалил.)

Для дальнейшего упрощения правая часть [[поддерживает подстановочные знаки:

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

Связанный контент