File 当文件存在于bash中时

File 当文件存在于bash中时,file,shell,while-loop,exists,bash,File,Shell,While Loop,Exists,Bash,它会检查文件“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 a

它会检查文件“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.temp]

line 43: [: f: unary operator expected
第52行=如果[$rResult-等式$rSaved]

line 52: [: too many arguments

任何帮助都将不胜感激:)

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


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

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


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

脚本中可能有一些变量未设置或为空。您可以将
set-x
设置为启用调试模式。

脚本中可能有一些变量未设置或为空。您可以将
set-x
设置为打开调试模式。

第43行中不是破折号,而是(复制它并在该页面上搜索以查看它)。你是从博客上复制代码的吗?他们经常在不该做的地方做这样的替换。守则应改为:

while [ ! -f ok.temp ]
-eq
用于数字,而不是字符串-这应该可以做到(引号很重要):


这不是第43行中的破折号,而是一个(复制它并在该页面上搜索以查看它)。你是从博客上复制代码的吗?他们经常在不该做的地方做这样的替换。守则应改为:

while [ ! -f ok.temp ]
-eq
用于数字,而不是字符串-这应该可以做到(引号很重要):


其中一个变量为空,或包含多个单词。使用引号:

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

其中一个变量为空,或包含多个单词。使用引号:

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


第43行和第52行是什么?(tl;dr)请至少更换导致错误的行。否则,想要查看它们的人必须单击“已编辑”链接。您的问题和下面的答案可能会使通过搜索找到此问题的其他人受益。第43行和第52行是什么?(tl;dr)请至少更换导致错误的行。否则,想要查看它们的人必须单击“已编辑”链接。您的问题和下面的答案可能会使通过搜索找到此问题的其他人受益。使用引号和==代替-eq修复了第52行中的字符串比较。第43行错误继续:(@Linky:while语句没有任何理由会给你这个错误。你用的是什么外壳?操作系统是什么?啊,我很抱歉。让我们留在shebang。我现在编辑标签。使用2.6.18-308.4.1.el5PAE#1 SMP周二4月17日15:07:30美国东部夏令时2012 i686 i386 GNU/Linux@Linky:哪个发行版?Debian、CentOS、Ubuntu…Which shell?破折号,Bash符号链接到
sh
…使用引号和==代替-eq修复了第52行中的字符串比较。第43行错误继续:(@Linky:while语句没有任何理由会给你这个错误。你用的是什么外壳?操作系统是什么?啊,我很抱歉。让我们留在shebang。我现在编辑标签。使用2.6.18-308.4.1.el5PAE#1 SMP周二4月17日15:07:30美国东部夏令时2012 i686 i386 GNU/Linux@Linky:哪个发行版?Debian、CentOS、Ubuntu…Wh我是shell?Dash,Bash符号链接到
sh
…你有着卓越的洞察力,因此赢得了整个互联网。+1请再详细解释一下。我应该做些什么?@l0b0不,我没有从博客中复制代码,但我是从我们的讲师在pdf中提供的一个骨架脚本示例提示中复制的。我很惊讶你居然能找到它,你有完美的视力。先生,你是男人中的国王。谢谢你!@DennisWilliamson:LOL!我的怀疑被证明是正确的:你确实拥有互联网!你拥有卓越的视力,因此赢得了整个互联网。+1请解释得更详细一点。我应该做些什么?@l0b0不,我没有从博客复制代码,但我是从骷髅复制代码的我们的讲师在pdf上提供了一个脚本示例提示。我很惊讶你居然学会了。事实上,你有完美的视力。先生,你是男人中的国王。谢谢你!@DennisWilliamson:LOL!我的怀疑得到了证实:你拥有互联网!