bash中if的无意义比较总是返回true
我已经阅读了我找到的所有手册和示例。我在上海试过,效果很好。但我仍然无法在我的bash文件中找到如何使其工作 我刚刚收到了以下代码: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
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)