如何在tcsh if语句中使用OR条件

时间:2016-02-17 08:46:09

标签: shell unix if-statement tcsh

我试图在tcsh shell的IF语句中使用OR条件。同一声明在CSH中有效。

示例陈述:(cat tesh.sh)

if [ "$1" == "hi" -o "$2" == "hello" ];then
echo hi
else
echo hello
fi

现在,如果我执行此示例脚本,则会出现以下错误:

[35] % sh -x test hi hi hello
+ test hi hi hello
test[7]: hi: A test command parameter is not valid.
+ exit 1
[36] % sh -x test hi hi
+ test hi hi
test[7]: test: Specify a parameter with this command.
+ exit 1
[37] % sh -x test hi hello
+ test hi hello
test[7]: test: Specify a parameter with this command.
+ exit 1
[38] % sh -x test hi hello
+ test hi hello
test[7]: test: Specify a parameter with this command.
+ exit 1
[39] %

请建议可以做些什么?

其他信息:

[44] % uname -s
HP-UX
[45] %
[45] % echo $SHELL
/bin/tcsh
[46] %

更多示例:

 cat new_test.txt
if ([ $1 == 1 ] || [ $2 == 1 ])
then
echo $1 and $2
fi

./new_test.txt 1 1
./new_test.txt: ==: A test command parameter is not valid.
./new_test.txt: ==: A test command parameter is not valid.

更多示例:

 cat suggested.sh

if (($1 == 1) || ($2 == 1)) ; then echo "$1 and $2" ; fi

 ./suggested.sh 1 1
./suggested.sh: 1:  not found.
./suggested.sh: 1:  not found.

1 个答案:

答案 0 :(得分:2)

有一些混淆:

  1. 您的第一个脚本是用bourne-shell编写的
  2. 你的脚本没有提到应该使用什么shell来解释它(这可能会导致一些混淆,具体取决于你执行它的方式)。
  3. 您的第二个脚本是tcsh脚本,但具有误导性语法
  4. 看起来你不知道[是什么。
  5. 像这样修改第一个脚本:

    #!/bin/sh
    if [ "$1" == "hi"  -o   "$2" == "hello" ]; then
      echo hi
    else
      echo hello
    fi
    

    这意味着如果可执行文件,此脚本将使用/bin/sh来解释它。但是,如果你用命令强制shell:

    % sh -x test hi hi
    + '[' hi == hi -o hi == hello ']'
    + echo hi
    hi
    % tcsh -x test hi hi
    if [ hi = hi -o hi = hello ]
    if: Expression Syntax.
    then
    then: Command not found.
    %
    

    您可以观察到使用错误的shell会导致一些语法错误。

    如果你想编写一个tcsh脚本,这是一个解决方案:

    #!/bin/tcsh
    if ( "$1" == "hi"  ||  "$2" == "hello" ) then
      echo hi
    else
      echo hello
    endif
    

    if的语法不同,因为tcsh具有内部测试功能,标准的bourne shell没有。在bourne shell中,使用外部命令test进行测试,该命令具有别名[。因此,您可以阅读手册中有关test语法的文档:

    SYNOPSIS
         test expression
         [ expression ] ...
         s1 = s2       True if the strings s1 and s2 are identical. ...
         expression1 -o expression2
                       True if either expression1 or expression2 are true.
    

    对于tcsh' if,请阅读tcsh手册(或csh其父级):

       if (expr) command
               If  expr (an expression, as described under Expressions) evalu-
               ates true, then command is executed.  Variable substitution  on
               command happens early, at the same time it does for the rest of
               the if command.  command must  be  a  simple  command,  not  an
               alias,  a  pipeline,  a command list or a parenthesized command
               list, but it  may  have  arguments.   Input/output  redirection
               occurs  even if expr is false and command is thus not executed;
               this is a bug.
    
       if (expr) then
       ...
       else if (expr2) then
       ...
       else
       ...
       endif   If the specified expr is true then the commands  to  the  first
               else are executed; otherwise if expr2 is true then the commands
               to the second else are executed, etc.  Any  number  of  else-if
               pairs are possible; only one endif is needed.  The else part is
               likewise optional.  (The words else and endif  must  appear  at
               the  beginning  of input lines; the if must appear alone on its
               input line or after an else.)
    
      Logical, arithmetical and comparison operators
           These operators are similar to those of C and have the same precedence.
           They include
    
               ||  &&  |  ^  &  ==  !=  =~  !~  <=  >=
               <  > <<  >>  +  -  *  /  %  !  ~  (  )
    ...