Bry*_*yan 3 linux math variables 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
Run Code Online (Sandbox Code Playgroud)
虽然脚本正确地删除了拇指,但它不会正确输出正在清除的拇指数量,它总是会显示0.
例如,只是手动创建了一些孤立的缩略图,然后运行我的脚本,手动生成的孤立的拇指被删除,但日志显示:
Thu Jun 9 23:30:12 BST 2011:0删除了多余的拇指
我在做什么错的是从显示大于零,当文件等多项停止$ filecounter 都被删除.
我已经创建了以下bash脚本来测试它,这完美地工作,0然后输出1:
#!/bin/bash
count=0
echo $count
count=$[$count+1]
echo $count
Run Code Online (Sandbox Code Playgroud)
编辑:
谢谢你的答案,但为什么以下工作
$ x=3
$ x=$[$x+1]
$ echo $x
4
Run Code Online (Sandbox Code Playgroud)
...并且第二个示例也有效,但它在第一个脚本中不起作用?
第二编辑:
这有效
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
Run Code Online (Sandbox Code Playgroud)
如由于更换count=$[$count+1]用count=$((count+1)),但不是在我最初的剧本.
你使用的是错误的操作员.请尝试使用$(( ... )),例如:
$ x=4
$ y=$((x + 1))
$ echo $y
5
$
Run Code Online (Sandbox Code Playgroud)
编辑
您遇到的另一个问题是管道问题.之前碰到了这个(有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
Run Code Online (Sandbox Code Playgroud)
...所以你应该看到循环中的filecount增加,但是最终的filecount将为零,因为这个echo属于主shell,但是forked subshell(它纯粹由while循环组成).
你可以获得价值的一种方法就是这样......
#!/bin/bash
filecount=0
filecount=`ls /bin | while read x
do
filecount=$((filecount + 1))
echo $filecount
done | tail -1`
echo $filecount
Run Code Online (Sandbox Code Playgroud)
这只有在你不关心循环中的任何其他stdout输出时才会起作用,因为这会将它从我们输出的最后一行(最终值filecount)抛出.这是有效的,因为我们使用stdout和stdin将数据反馈给父shell.
根据你的观点,这可能是一个令人讨厌的黑客或一个漂亮的贝壳jiggery-pokery.我会让你决定你的想法:-)