Bash无法像我想的那样得到IF

时间:2009-10-12 18:42:08

标签: bash types boolean

我需要了解bash if expression。当然,我使用过谷歌。我知道它是这样的:

if [ expr operator expr ]
then
doSomeThing
fi

但是,据我所知,Bash没有布尔数据类型。我想检查作为参数($ 1)传递的文件是否存在。我会直接这样做的方式:

if [ -e $1 = true ] 
then 
echo "File exists."
fḯ

或者也许喜欢:

if [ -e $1 ] #Assuming that this is true only if file in $1 exists. 

这些都不起作用,我不确定[]的含义。 -e $ 1似乎是一个明智的选择,但它总是如此?字符串和整数有不同的运算符。而且我不能使用括号将表达式组合在一起。这太令人困惑了。

任何人都有一些提示? bash中的IF不能像我尝试过任何其他语言一样工作。

4 个答案:

答案 0 :(得分:3)

[...]

表示程序/usr/bin/test...作为参数执行,并且检查其返回值(0表示truex != 0表示{{ 1}}(是的,false在这里真的意味着0,因为true是UNIX中的0退出代码))。所以

OK

是对的。它与

相同
if [ -e $1 ]; then
    echo "ok"
fi

唯一的问题是if test -e $1; then echo "ok" fi 可能包含空格。如果是这样$1会混淆,因为它会得到3个或更多的参数。第一个(/usr/bin/test)是一元运算符(想要一个参数)。既然你给它2个或更多(一个-e参数是/usr/bin/test本身),它会抱怨:

-e

所以,只需使用

...: binary operator expected

如果if [ -e "$1" ];then echo "ok" fi 包含空格,那甚至可以工作。另一种可能性是使用

$1

这样做会相同,但它会被bash本身评估,并且没有if [[ -e $1 ]]; then echo "ok" fi 程序被分叉。

化合物与往常一样,但/usr/bin/test表示-aand表示-o。所以

or
如果if [ -e /etc/fstab -a -e "$1" ]; then echo "ok" fi 和作为第一个命令行参数给出的文件存在,

将回显ok。

答案 1 :(得分:3)

正如其他人所提到的,[实际上是test命令,因此它的参数根据标准参数解析规则进行解析,这会强制一些相当不方便和混乱的语法。例如,你可以在测试命令中使用括号<>,但你最好逃避它们,否则shell会将它们视为不幸的意思。

有一个更好的解决方案:conditional expression,看起来很像老式的测试命令,但在表达式周围使用[[ ]]而不是[ ]。因为它不是作为命令解析的,所以它具有更自然的语法,并且还具有一些更强大的功能:

if [[ -e $1 && ! -d $1 ]]; then  # if $1 exists but isn't a directory...
    # note that quotes are not needed, since $1 will not undergo word splitting
[[ $string == done ]] # string comparison
[[ $string == a* ]] # glob-style pattern matching: does $string start with "a"?
[[ $string == "*"* ]] # partial glob: does $string start with "*"?
[[ $string =~ ^[[:upper:]] ]] # regex matching: does $string start with an upper-case letter?
[[ $string < g ]] # string comparison: is $string alphabetically before "g"
[[ $num -lt 5 ]] # numeric comparison: is $num numerically less than 5

答案 2 :(得分:0)

[]是bash测试命令的简写 http://ss64.com/bash/test.html

如果bash中的操作检查用于测试的命令的返回代码是否为0。

您可以使用以下命令检查任何命令的返回状态: echo $?

例如试试这个:

test -e myfile.txt
echo $?
[ -e myfile.txt ] 
echo ?$

答案 3 :(得分:0)

  1. 请参阅man test
  2. 这应该有效:

    function foo() {
      if [ -e "$1" ] ; then
        echo "$1 exists"
      fi
    }
    
  3. 有几种方法可以编写复合表达式: 和

    [ expr1 -a expr2 ]
    

    或:

    [ expr1 -o expr2 ]
    

    您还可以使用[[ expr && expr || expr ]]语法