2016-08-03 49 views
-1

所以我尝试了这一点,如果在UNIX elif的代码中使用“bash脚本”,它是给我这个输出庆典错误“命令未找到”使用时,如果用“或”运算符

script[11]: pc4: command not found 
script[14]: pc4: command not found 

代替“-o”我以前有“|”作为“或”运营商,但那不起作用。另外,我收到括号但耶...

#!/bin/bash 
host=`hostname` 
test1="pc4" 
test2="pc5" 
prod1="t01" 
prod2="t02" 
prod3="t03" 
prod4="t04" 
path="/home/test1/test2/test3" 

if "$host" = "$test1" -o "$host" = "$test2" 
    then 
     echo "test loaded" 
elif "$host" = "$prod1" -o "$host" = "$prod2" -o "$host" = "$prod3" -o "$host" = "$prod4" 
    then 
     echo "prod loaded" 
else 
     echo "bad host" 
fi 

编辑:固定它,它必须是:

if [ "$host" = "$test1" -o "$host" = "$test2" ]; 
... 
... 
elif [ "$host" = "$prod1" -o "$host" = "$prod2" -o "$host" = "$prod3" -o "$host" = "$prod4" ]; 

感谢所有!

+1

'|'是管道,''||会是或。但是'if'基于命令的返回值工作,所以你想把条件包装在'[...]'中。请注意,'['本身就是一个命令,而不是任何语法的一部分。 – Siguza

+0

@Siguza好了再次尝试加入[],现在它可以工作,也许我忘了在括号之后和之前使用空格。谢谢,是|| =或者只是bash或者一般的or?认为这是| –

+0

在大多数编程语言中,'|'是按位或“||”是逻辑或。 – Siguza

回答

3

你不是在调用命令; -otest命令的运算符,尽管不建议使用它。

if test "$host" = "$test1" -o "$host" = "$test2" 
then 
    echo "test loaded" 
elif test "$host" = "$prod1" -o "$host" = "$prod2" -o "$host" = "$prod3" -o "$host" = "$prod4" 
then 
    echo "prod loaded" 
else 
    echo "bad host" 
fi 

相反,使用由运营商||加入到test多次调用。 (断行可为||可读性后很容易地添加。)

if test "$host" = "$test1" || 
    test "$host" = "$test2" 
then 
    echo "test loaded" 
elif test "$host" = "$prod1" || 
    test "$host" = "$prod2" || 
    test "$host" = "$prod3" || 
    test "$host" = "$prod4" 
then 
    echo "prod loaded" 
else 
    echo "bad host" 
fi 

最后,你可能要考虑使用case语句来代替:

case $host of 
    "$test1"|"$test2") echo "test loaded" ;; 
    "$prod1"|"$prod2"|"$prod3"|"$prod4") echo "prod loaded" ;; 
    *) echo "bad host" ;; 
esac 
0

你需要把你的ifelif条件括号:

#!/bin/bash 
host=`hostname` 
test1="pc4" 
test2="pc5" 
prod1="t01" 
prod2="t02" 
prod3="t03" 
prod4="t04" 
path="/home/test1/test2/test3" 

if [ "$host" = "$test1" -o "$host" = "$test2" ] 
    then 
     echo "test loaded" 
elif [ "$host" = "$prod1" -o "$host" = "$prod2" -o "$host" = "$prod3" -o "$host" = "$prod4" ] 
    then 
     echo "prod loaded" 
else 
     echo "bad host" 
fi 

请注意空间之前和之后[是至关重要的。

+2

“方括号”不是shell语法:'['是一个**命令**,它可以作为shell内建实现或在'/ usr/bin/['(或'/ bin/['中找到)你的操作系统) - 它通常由'test'命令执行相同的命令(通过作为相同内置函数的第二个入口或者硬链接到同一个磁盘文件)来实现。此外,'-o'被POSIX测试标准的当前版本明确标记为过时;请参阅http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html(以及各种[OB]标记)。 –

0

-otest命令或[命令支持的语法。

所以附上条件withing []如图所示:

if [ "$host" = "$test1" -o "$host" = "$test2" ]; 
then 
     echo "test loaded" 
elif [ "$host" = "$prod1" -o "$host" = "$prod2" -o "$host" = "$prod3" -o "$host" = "$prod4" ]; 
then 
     echo "prod loaded" 
else 
     echo "bad host" 
fi 

请参阅本link

+2

请注意,现代POSIX'测试'标准将'-o'和'-a'标记为过时,并且具有超过四个参数的'test'的调用会导致标准未定义结果。请参阅http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html中的[OB] –

0

试试这个;

#!/bin/bash 
host=`hostname` 
test1="pc4" 
test2="pc5" 
prod1="t01" 
prod2="t02" 
prod3="t03" 
prod4="t04" 
path="/home/test1/test2/test3" 

if [ "$host" = "$test1" ] || [ "$host" = "$test2" ] ; then 
echo "test loaded" 
elif [ "$host" = "$prod1" ] || [ "$host" = "$prod2" ] || [ "$host" = "$prod3" ] || [ "$host" = "$prod4" ] 
    then 
     echo "prod loaded" 
else 
     echo "bad host" 
fi 
0

相关搜索:

#!/bin/bash 
host=`hostname` 
test1="pc4" 
test2="pc5" 
prod1="t01" 
prod2="t02" 
prod3="t03" 
prod4="t04" 
path="/home/test1/test2/test3" 

if [[ "$host" == "$test1" ]] || [[ "$host" == "$test2" ]] 
then 
    echo "test loaded" 
elif [[ "$host" == "$prod1" ]] || [[ "$host" == "$prod2" ]] || [[ "$host" == "$prod3" ]] || [[ "$host" == "$prod4" ]] 
then 
    echo "prod loaded" 
else 
    echo "bad host" 
fi 

虽然这是事实,只是一个“=”需要用于字符串相等比较,“=”也被用来作为赋值运算符。因此,为了减少可能的混淆并作为“最佳实践”,我会使用“==”来表示字符串相等。恰巧“==”只是“=”的同义词,但我不希望为了多种目的而使用相同的运算符。
注:我不是暗示POSIX兼容性。

+0

如果您要通过'='建议'==',请使用'[[]]同样 - 这样你并不意味着与POSIX测试兼容,因为标准明确地只将'='定义为支持。 –

+0

@CharlesDuffy - 好点,我会将其添加到我的回复中。谢谢。 – tale852150

相关问题