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

bash中if的无意义比较总是返回true,bash,Bash,我已经阅读了我找到的所有手册和示例。我在上海试过,效果很好。但我仍然无法在我的bash文件中找到如何使其工作 我刚刚收到了以下代码: echo "$#" if [ $# == 4 ]; then #Some code 1º else #Some code 2º fi (这只是我做的最后一次尝试,基于) 但是我总是在我的1º代码中得到错误,因为比较总是返回true。然后,我说好,让我们试试另一面: echo "$#" if [ ! $# == 4 ]; then #Some code

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

我刚刚收到了以下代码:

echo "$#"
if [ $# == 4 ]; then
  #Some code 1º
else
  #Some code 2º
fi
(这只是我做的最后一次尝试,基于)

但是我总是在我的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中,然后失败,因为我运行它时没有参数(
$#是0

如果我使用以下内容创建一个单独的脚本:

#/bin/bash
if [ $# -eq 4 ]; then

    echo "4 parameters"

fi
它跑得很好

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


如您所见,“if”中的一行出现了错误,因为它进入了该行,但它不能进入该行。

您是否意识到该代码毫无意义:

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/"

你的实际论点是什么?您是否总是向脚本提供3个参数?我建议您尝试创建一个,因为使用您粘贴的代码,我无法相信您的说法。因此,如果它总是分支到错误分支,因为您没有传递任何参数,请传递一些参数。我强烈建议你扔掉这段代码,重新开始。不要担心代码的细节。想想你想完成什么,从一两句话开始,这会让你走上一段路。@BtcSources:我没有否决投票,但我可以看到人们是如何看待你的问题中太多的“噪音”的——你确实从一些人那里得到了有用的提示。试着把你的代码精简到最简单的例子中去。考虑使用<代码> SET-X/COD>围绕感兴趣的语句来进行BASH打印调试信息。@ BTCSoistsDopStand我投票否决了这个问题,因为很明显,看到您编辑并与有用的评论家争论,您已经巩固了一个适当的位置,使您的问题广泛、不清楚,并且非琐碎地重现。因此,你需要做更多的工作,这样人们才能帮助你。你是对的,我更新了这个问题。感谢您的耐心。@BTC资源不会以旧答案不再有意义的方式改变问题。因此,创建一个问题和答案库来帮助未来的程序员。如果问题在答案发布后被重写,那就不起作用了。而且,如果格伦是对的,就投票给他。我刚做了。问题还是一样的,问题还是一样的。它总是在if里面,不是。这一行是
filesfound=(ls-1$path | wc-l)
,那么这一行中出现的问题是因为它在执行的时候必须不执行,因为当没有需要的参数时,
$path
值是错误的。当我使用4个参数执行脚本时,它运行正常。如果修复该语法错误,您可能会发现脚本工作正常:
filesfund=$(ls-1$path | wc-l)