在bash中if的无意义比较总是返回true

时间:2015-03-08 20:02:02

标签: bash

我已经阅读了我找到的所有手册和示例。我已经尝试过了,并且工作过。但我仍然无法找到如何使其在我的bash文件中工作。

我只是这段代码:

echo "$#"
if [ $# == 4 ]; then
  #Some code 1º
else
  #Some code 2º
fi

(这只是我做过的最后一次尝试,基于Testing the number of arguments

但我总是在我的1º代码中出错,因为比较总是返回true。然后,我说好了,让我们试试另一方:

echo "$#"
if [ ! $# == 4 ]; then
  #Some code 1º
else
  #Some code 2º
fi

刚刚否定了if中表达式的值,正如我之前说过的手册中所做的那样。没什么,它仍然进入1º代码。

我不知道我还能尝试什么,已经尝试过了:

"$#" == "4"
"$#" -eq "4"
$# -gt 4

还有一些基于我读过的手册。

任何人都能解释一下我做错了什么吗?

非常感谢

PS:无论如何,有代码:

#!/bin/bash
function backup()
{
  #Some code


echo "$#"

if [ $# -eq 4 ]; then
  rootpath=${1}
  uvus=${2}
  title=${3}
  file=${4}

  path="${rootpath}$uvus/$title/VersionActual/"
  pathbackups="${rootpath}$uvus/$title/VersionesAnteriores/"
  filepath="${path}$file"

  if [ -r $filepath ]; then

    filesfound=(ls -1 $path | wc -l)

    if [ "0" != $filesfound ] ; then

      backup $pathbackups $file

    fi

  else

    echo 'Error 2'

  fi

else

  echo 'Error 1'

fi

所以这段代码总是进入if,然后失败,因为我在没有参数的情况下运行它($# is 0)。

如果我用:

创建一个单独的脚本
#/bin/bash
if [ $# -eq 4 ]; then

    echo "4 parameters"

fi

运行正常!

更新:使用一些参数添加关于执行的图片

Execution with some parameters

正如您所看到的,“if”中有一条线出现了错误,因为它进入了它,当它不能进入​​时。

1 个答案:

答案 0 :(得分:1)

你是否意识到这段代码毫无意义:

if [ $# == 0 ]; then
  rootpath=${1}
  uvus=${2}
  title=${3}
  file=${4}

如果参数为零,则只输入此分支,然后尝试将零参数分配给这些变量,这些变量现在都将保留空值。

您的测试应该是:if [ $# -eq 4 ]

此代码

path=(rootpath . uvus . '/' . title . '/VersionActual/')

创建一个包含9个元素的数组,其中4个是"。" - 你想说

path="${rootpath}$uvus/$title/VersionActual/"