Bash 当我使用命令“执行脚本时”;在;,我得到一个无限循环

Bash 当我使用命令“执行脚本时”;在;,我得到一个无限循环,bash,loops,at-job,Bash,Loops,At Job,我正在学习bash shell,我是一名初学者。 现在,我有一个脚本,名为_test #!/bin/bash var1=3 until [ $var1 -eq 0 ] do echo "Outer loop: $var1" var2=1 while [ $var2 -lt 5 ] do var3=`echo "scale=4; $var1 / $var2" | bc` echo " Inner loop:$var1 / $var2 =

我正在学习bash shell,我是一名初学者。
现在,我有一个脚本,名为_test

#!/bin/bash
var1=3
until [ $var1 -eq 0 ]
do
    echo "Outer loop: $var1"
    var2=1
    while [ $var2 -lt 5 ]
    do
        var3=`echo "scale=4; $var1 / $var2" | bc`
    echo "    Inner loop:$var1 / $var2 = $var3"
    var2=$[ $var2 + 1 ]
    done
    var1=$[ $var1 - 1 ]
done >> temp.log.txt
当我在终端中执行它时,它工作得很好。

Outer loop: 3
    Inner loop:3 / 1 = 3.0000
    Inner loop:3 / 2 = 1.5000
    Inner loop:3 / 3 = 1.0000
    Inner loop:3 / 4 = .7500
Outer loop: 2
    Inner loop:2 / 1 = 2.0000
    Inner loop:2 / 2 = 1.0000
    Inner loop:2 / 3 = .6666
    Inner loop:2 / 4 = .5000
Outer loop: 1
    Inner loop:1 / 1 = 1.0000
    Inner loop:1 / 2 = .5000
    Inner loop:1 / 3 = .3333
    Inner loop:1 / 4 = .2500
但当我这样执行时:

at -f for_test 11:10
echo "/bin/bash /path/to/script.sh" | at 11:10
当时间到了,脚本被执行,但我得到了一个无限循环。
这是日志

Outer loop: 3
    Inner loop:3 / 1 = 3.0000
    Inner loop:3 / 1 = 3.0000
    Inner loop:3 / 1 = 3.0000
    ……
我发现$var2总是等于1

我做错了什么


我的ubuntu版本和bash版本

$ uname -a
Linux android_su 2.6.35-32-generic #67-Ubuntu SMP Mon Mar 5 19:39:49 UTC 2012 x86_64 GNU/Linux


$ bash --version
GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

尝试改用内部函数,因为路径并不总是在crontab和like中定义:

#!/bin/bash
var1=3
until (( var1 == 0 ))
do
    echo "Outer loop: $var1"
    var2=1
    while (( var2 < 5 ))
    do
        var3=$(echo "scale=4; $var1 / $var2" | bc)
        echo "    Inner loop:$var1 / $var2 = $var3"
        (( ++var2 ))
    done
    (( --var1 ))
done >> temp.log.txt


at 11:10当使用
at-f
时,脚本中的命令将被解析,就像您键入了它们一样。这意味着
#/bin/bash
只是一条注释,不会导致脚本在
bash
下执行。如果您没有使用
-f
,位于
会告诉您:

$ at 0900
warning: commands will be executed using /bin/sh
使用
/bin/sh
的问题是,true Bourne shell不支持您正在使用的数学扩展,如
$[1+2]
。这些都是由
ksh
(afaik)引入的,现在可以在
bash
中找到。有些人可能会对他们的系统使用不同的结果,因为并非所有的系统都使用相同的
sh
。有些只是使用了
bash
,但还有更多类似于伯恩的变体,比如
ash
,可能还有
busybox
中的任何shell


您只需要制作一个调用脚本的包装器(只是一个包含
/path/to/script
的文件),并使用该文件作为
at-f

的输入。这段代码对我来说是
at
的。Fedora 16至于第二个命令还有一个警告。它只是显示命令是通过/bin/sh来解释的。但是您传递了一个将调用
/bin/bash
/path/to/sh`so
的命令,at
调用
sh
来读取命令
/bin/bash…
,然后调用
/bin/bash
,参数为
/path/to/sh
,bash读取脚本。它仍然在运行不起作用。我得到一个无限输出“Outer loop:3”@android_-su确保您使用bash(/bin/bash)运行它,而不是其他shell。@android_-su我做了一个更新,显示了一些使用bash显式运行它的示例。我认为第一行“#!/bin/bash”决定了我使用哪个shell,我说的对吗?@android_-su如果你通过另一个调度器调用文件,有时你不能太依赖它。@ruakh:
$[1+2]
数学由
ksh
(原始源代码,afaik)和
bash
支持,但不是经典的
sh
。但是,不同的系统对
sh
使用不同的外壳,有些外壳比其他外壳更原始(例如
ash
at 11:10 <<EOF
/bin/bash /path/to/script.sh
EOF
$ at 0900
warning: commands will be executed using /bin/sh