使用 OR 门在单个 if 语句 shell 脚本中进行多字符串比较

Mah*_*dra 1 bash shell-script

我试图将存储在变量中的字符串与三个不同的字符串进行比较,如果它们都不匹配,则抛出错误。我尝试使用逻辑运算符 OR 在单个 if 语句中执行此操作。但是每次我收到错误时,即使存储在变量中的值与可能的值之一相同。请找到我尝试过的片段。

if [[ "$TYPE" != "LOCAL" || "$TYPE" != "REMOTE" || "$TYPE" != "BOTH" ]]; then
    echo -e "\n\tINCORRECT OR NULL ARGUMENTS PASSED. PLEASE VERIFY AND CORRECT THE USAGE MENTIONED AS BELOW: \n"
    Usage
    exit 1
fi


if [[ "$TYPE" != "LOCAL" ]] || [["$TYPE" != "REMOTE" ]] || [["$TYPE" != "BOTH" ]]; then
    echo -e "\n\tINCORRECT OR NULL ARGUMENTS PASSED. PLEASE VERIFY AND CORRECT THE USAGE MENTIONED AS BELOW: \n"
    Usage
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 8

你的逻辑倒退了。任意字符串被保证是从任一不同LOCAL 不同REMOTE,因为字符串不能LOCALREMOTE在同一时间。

在这里,该任务的正确工具是一条case语句(这是sh与那些[[...]]ksh 运算符相反的标准语法):

case $TYPE in
  (REMOTE|LOCAL|BOTH) ;; # OK
  (*) printf >&2 'Error...\n'; exit 1;;
esac
Run Code Online (Sandbox Code Playgroud)

如果您想在[[,kshbashzshksh仿真中使用,您可以执行以下操作:

if [[ $TYPE != @(REMOTE|LOCAL|BOTH) ]]; then
  printf >&2 'Error...\n'
  exit 1
fi
Run Code Online (Sandbox Code Playgroud)

[[ $TYPE != REMOTE && $TYPE != LOCAL && $TYPE != BOTH ]][[ ! ($TYPE = REMOTE || $TYPE = LOCAL || $TYPE = BOTH) ]]等。

或者使用标准[命令:[ "$TYPE" != REMOTE ] && [ "$TYPE" != LOCAL ] && [ "$TYPE" != BOTH ].

使用ksh93, bashor zsh,另一种选择是使用关联数组:

typeset -A allowed_TYPE
allowed_TYPE=([REMOTE]=1 [LOCAL]=1 [BOTH]=1)
if ((!allowed_TYPE[\$TYPE])); then
  printf >&2 'Error...\n'
  exit 1
fi
Run Code Online (Sandbox Code Playgroud)

\\$TYPE是很重要的,以避免引入任意命令执行漏洞)。

使用 zsh,您还可以使用普通数组:

 allowed_TYPE=(REMOTE LOCAL BOTH)
 if ((! $allowed_TYPE[(Ie)$TYPE]))...
Run Code Online (Sandbox Code Playgroud)