虽然文件存在于 bash

Posted

技术标签:

【中文标题】虽然文件存在于 bash【英文标题】:While file exists in bash 【发布时间】:2012-05-24 11:02:25 【问题描述】:

它几乎检查文件'ok.temp'是否存在。如果不是,它会在再次检查之前进入睡眠循环 2 秒。在文件被认为存在后,它会继续。

不幸的是,我收到以下代码中所述的错误:

#!/bin/sh
# Read the sensor values
if [ ! -f saved.txt ]
then
    touch saved.txt
fi 

#saved values count
sCount=0

#value aggregates
vTTemp=0
vTHumid=0
vTLux=0

#previous aggregates
pTTemp=0
pTHumid=0
pTLux=0

while : 
do
vTemp=0
vHumid=0
vLux=0

if [ $sCount -gt 0 ] 
then
    if [ $(( $sCount % 5 )) -eq 0 ]
    then
        #set previous aggregates as current
        pTTemp=$vTTemp
        pTHumid=$vTHumid
        pTLux=$vTLux

        #reset current aggregates
        vTTemp=0
        vTHumid=0
        vTLux=0
    fi
fi

    while [ ! –f ok.temp ]
    do
        sleep 20
    done

    if [ -f logfile.txt ]
    then
        rResult=`tail -1 logfile.txt`
        rSaved=`tail -1 saved.txt`
        if [ $rResult -eq $rSaved ]
        then
            vTemp=`echo $rResult | cut -d" " -f1`
            vHumid=`echo $rResult | cut -d" " -f2`
            vLux=`echo $rResult | cut -d" " -f3`
            echo $rResult >> saved.txt

            # aggregate results
            vTTemp=`expr $vTTemp + $vTemp`
            vTHumid=`expr $vTHumid + $vHumid`
            vTLux=`expr $vTLux + $vLux`
            echo 'Most recent results recieved from sensor has been saved'
        else
            echo 'Most recent result has already been saved, skipping'
        fi
    fi

    echo '[Previous] Temp:'$pTTemp' Humid:'$pTHumid' Lux:'$pTLux
    echo '[Current] Temp:'$vTTemp' Humid:'$vTHumid' Lux:'$vTLux

    sCount=`expr $sCount + 1`
done

我收到这些错误:

第 43 行 = 而 [ ! -f ok.t​​emp ]

line 43: [: f: unary operator expected

第 52 行 = if [ $rResult -eq $rSaved ]

line 52: [: too many arguments

任何帮助将不胜感激:)

【问题讨论】:

第 43 行和第 52 行是什么? (tl;博士) 请至少替换导致错误的行。否则,想要查看它们的人必须单击“已编辑”链接。您的问题和下面的答案可能会使通过搜索找到此问题的其他人受益。 【参考方案1】:

这不是第 43 行中的破折号 - 这是一个 en dash(复制它并在该页面上搜索以查看它)。您是否从博客中复制了该代码?他们经常在不应该的地方进行此类替换。代码应为:

while [ ! -f ok.temp ]

-eq 用于数字,而不是字符串 - 这应该可以解决问题(引号很重要):

if [ "$rResult" = "$rSaved" ]

【讨论】:

您拥有超凡的视野,因此赢得了整个互联网。 +1 请详细解释一下。我应该改变什么? @l0b0 不,我没有从博客中复制代码,而是从我们的讲师从 pdf 中获得的骨架脚本示例提示中复制的。我很惊讶你居然发现了它,你的视力很完美。先生,您是人中的王者。谢谢你! @DennisWilliamson:哈哈!我的怀疑得到了证实:您确实拥有互联网!【参考方案2】:

很可能是因为您使用了单方括号内为空的未加引号的变量。您可以通过使用首选的双方括号形式或引用变量来解决此问题(不需要同时进行这两种操作)。

您已标记您的问题bash,但您的shebang 说#!/bin/sh,并且您的脚本形式遵循Bourne shell 约定,而不是使用Bash 特定的功能。如果您愿意,我可以评论您如何利用这些 Bash 功能。

【讨论】:

通过使用引号和 == 而不是 -eq 修复了第 52 行中的字符串比较。第 43 行错误继续:( @Linky:我看不出while 语句应该给你这个错误的任何理由。你用的是什么外壳?什么是操作系统? 啊抱歉。让我们留在shebang。我现在将编辑标签。 使用 2.6.18-308.4.1.el5PAE #1 SMP Tue Apr 17 15:07:30 EDT 2012 i686 i686 i386 GNU/Linux @Linky:哪个发行版? Debian、CentOS、Ubuntu……哪个外壳? Dash、Bash 符号链接到 sh...【参考方案3】:

脚本中的某些变量可能未设置或为空。可以设置set -x开启调试模式。

【讨论】:

【参考方案4】:

您的变量之一为空,或包含多个单词。使用引号:

if [ "$rResult" = "$rSaved" ]

【讨论】:

以上是关于虽然文件存在于 bash的主要内容,如果未能解决你的问题,请参考以下文章

列_ID不存在错误虽然它存在于表中

bash 错误处理 - 文件是不是存在? [复制]

Bash - 文件存在提供不正确的结果

如何使用 Bash 测试文件中是不是存在字符串?

shell bash判断文件或文件夹是否存在

检查文件是不是存在Linux bash [重复]