Si la declaración o con parámetros $1 sigue fallando

Si la declaración o con parámetros $1 sigue fallando

He escrito el siguiente script bash para ejecutar blanqueador.

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

El guión se llama bb. Siempre recibo el mismo mensaje ya sea que ejecute bb, bb x, bb g, bb c o bb p.

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

Los comandos reales de Bleachbit nunca se ejecutan. Soy un poco novato, así que agradezco cualquier ayuda que pueda recibir sobre esto.

Respuesta1

Su control principal es lógicamente imposible de satisfacer:

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

Debido a que tiene "(no p) O (no c)", esto devolverá VERDADERO cuando $1 sea "c" (porque no es "p") y de la misma manera devolverá VERDADERO cuando $1 sea "p" (porque es no "c"), por lo que recibirá el mensaje de error en ambos casos.

La única forma en que devolvería FALSO es si la variable tuviera ambos valores.simultáneamente, pero Bash aún no tiene superposiciones cuánticas. (Perl podría).

En su lugar , esto funcionaría con un &&operador (Y):

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

Para mayor claridad, puede usar !(NOT) para invertir la condición:

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

(La verificación del recuento de parámetros $# es redundante aquí, así que la eliminé).

Para simplificarlo aún más, el lado derecho de [[admite comodines:

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

información relacionada