If ou instrução com parâmetros $1 continua falhando

If ou instrução com parâmetros $1 continua falhando

Eu escrevi o seguinte script bash para executar o 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

O script é chamado bb. Sempre recebo a mesma mensagem, quer eu apenas execute bb, bb x, bb g, bb c ou bb p.

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

Os comandos reais do Bleachbit nunca são executados. Sou um pouco novato, então agradeço qualquer ajuda que puder obter sobre isso.

Responder1

Sua verificação principal é logicamente impossível de satisfazer:

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

Porque você tem "(not p) OR (not c)", isso retornará TRUE quando $1 for "c" (porque não é "p") e da mesma forma retornará TRUE quando $1 for "p" (porque é não "c") e, portanto, você receberá a mensagem de erro em ambos os casos.

A única maneira de retornar FALSE é se a variável contiver ambos os valoressimultaneamente, mas o Bash ainda não possui superposições quânticas. (Perl pode.)

Isso funcionaria com um &&operador (AND):

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

Para maior clareza, você poderia usar !(NOT) para inverter a condição:

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

(A verificação de contagem de parâmetros $# é redundante aqui, então eu a removi.)

Para simplificar ainda mais, o lado direito de [[suporta curingas:

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

informação relacionada