微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – Bash变量数学不起作用

我有一个简单的bash脚本,它构成了我开发的内部Web应用程序的一部分.

其目的是在用户删除原始图像时自动删除图像的缩略图.

该脚本将一些基本状态信息记录到文件/var/log/images.log中

#!/bin/bash
cd $thumbpath
filecount=0
# Purge extraneous thumbs
find . -type f | while read file
do
  if [ ! -f "$imagepath/$file" ]
  then
    filecount=$[$filecount+1]
    rm -f "$file"
  fi
done
echo `date`: $filecount extraneous thumbs removed>>/var/log/images.log

虽然脚本正确删除了拇指,但它没有正确输出正在清除的拇指数,它总是显示0.

例如,只是手动创建了一些孤立的缩略图,然后运行我的脚本,手动生成的孤立的拇指被删除,但日志显示

Thu Jun 9 23:30:12 BST 2011: 0 extraneous thumbs removed

我正在做错的是,当文件删除时,阻止$filecounter显示非零的数字.

我已经创建了以下bash脚本来测试它,这完美地工作,输出0然后输出1:

#!/bin/bash
count=0
echo $count
count=$[$count+1]
echo $count

编辑:

谢谢你的答案,但为什么以下工作呢

$x=3
$x=$[$x+1]
$echo $x
4

…并且第二个示例也有效,但它在第一个脚本中不起作用?

第二编辑:

这有效

count=0
echo Initial Value $count
for i in `seq 1 5`
do
  count=$[$count+1]
  echo $count
done
echo Final Value $count


Initial Value 0
1
2
3
4
5
Final Value 5

将count = $[$count 1]替换为count = $((count 1)),但不是在我的初始脚本中.

解决方法:

你使用的是错误的运算符.尝试使用$((…))代替,例如:

$x=4
$y=$((x + 1))
$echo $y
5
$

编辑
你遇到的另一个问题是管道问题.之前碰到了这个(用ksh,但我不会惊讶地发现其他炮弹有同样的问题).管道正在分支另一个bash进程,所以当你执行增量时,filcount会在管道之后分叉的子shell中增加.由于子shell具有自己独立的环境(环境变量在被调用的进程中继承,但被调用的进程无法修改调用进程的环境),因此该值不会传递回调用shell.

作为一个例子,这表明filecount增加好了:

#!/bin/bash

filecount=0
ls /bin | while read x
do
        filecount=$((filecount + 1))
        echo $filecount
done
echo $filecount

…所以你应该看到循环中的filecount增加,但是最终的filecount将为零,因为这个echo属于主shell,但是分叉​​的子shell(它纯粹由while循环组成).

你可以获得价值的一种方法就是这样……

#!/bin/bash

filecount=0
filecount=`ls /bin | while read x
do
        filecount=$((filecount + 1))
        echo $filecount
done | tail -1`
echo $filecount

这只有在你不关心循环中的任何其他stdout输出时才会起作用,因为这会将它抛出我们输出的最后一行(filecount的最终值).这是有效的,因为我们使用stdout和stdin将数据反馈给父shell.

根据你的观点,这可能是一个令人讨厌的黑客或一个漂亮的贝壳jiggery-pokery.我会让你决定你的想法:-)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐