我正在学习bash shell,我是初学者 现在,我有一个名为for_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
当时间到了,脚本被执行,但我得到一个无限循环 这是日志。
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.
@konsolebox
第二个命令工作正常。谢谢。
但为什么第一个命令不起作用?我还是有点担心
第一个和第二个命令都是用/ bin / sh执行的。
$ at -f for_test 14:16
warning: commands will be executed using /bin/sh
job 22 at Thu Aug 29 14:16:00 2013
$ echo "/bin/bash /home/android_su/android/source/linux_learned/for_test" | at 14:19
warning: commands will be executed using /bin/sh
job 23 at Thu Aug 29 14:19:00 2013
答案 0 :(得分:2)
使用at -f
时,脚本中的命令将被解析为,就像您在中键入它们一样。这意味着#!/bin/bash
只是一个注释,不会导致您的脚本在bash
下执行。如果您没有使用at
,-f
会告诉您:
$ at 0900
warning: commands will be executed using /bin/sh
使用/bin/sh
的问题在于,真正的Bourne shell不支持您使用的数学扩展,如$[ 1 + 2 ]
。这些是ksh
(afaik)介绍的,现在可以在bash
中找到。有些人可能会使用系统/bin/sh
获得不同的结果,因为并非所有系统都使用相同的sh
。有些只是使用bash
,但有更多类似Bourne的变体,例如ash
,可能是busybox
中的任何shell。
你只需要创建一个调用脚本的包装器(只是一个包含/path/to/script
的文件)并使用该文件作为at -f
的输入
答案 1 :(得分:1)
尝试使用内部函数,因为PATH并不总是在crontabs中定义并且喜欢:
#!/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
确保以bash的形式运行脚本:
echo "/bin/bash /path/to/script.sh" | at 11:10
或者
at 11:10 <<EOF
/bin/bash /path/to/script.sh
EOF