0

我正在尝试在 solaris 中执行这个简单的脚本。我想对源目录中文件的文件名进行排序(数字)并将文件一个一个复制到另一个目录。而且,我想在复制每 100 个文件后打印一条消息。

#!/bin/bash

count=0

for i in `ls | sort -n`
do 
 cp $i ../target
 count = $((count+1))
 if[ $count%100 -eq 0 ] 
 then
    echo $count files copied
    sleep 1
 fi

done

这是行不通的。在网上搜索后,我尝试了不同的东西。
我收到这样的错误 -

第 8 行的语法错误:'(' 意外。
第 10 行的语法错误:'then' 意外。
第 13 行的语法错误:'fi' 意外等。

这个脚本有什么问题?

bash 版本 - GNU bash,版本 3.00.16(1)-release (sparc-sun-solaris2.10)

4

3 回答 3

2

脚本的基本问题是间距。你有你不应该有的空间:

(wrong)  count = $((count+1))
(right)  count=$((count+1))
(better) ((count++))

并且您缺少需要它们的空间:

(wrong)  if[ $count%100 -eq 0 ]
(right)  if [ $((count % 100)) -eq 0 ]
(better) if ((count % 100 == 0))

count = $((count+1))尝试运行将count两个参数传递给它的命令,=以及count+1. if[ ...尝试运行该命令if[,因为[它是一个有效的单词字符;它不会自动启动新令牌。

说了这么多,我对unexpected (错误信息感到困惑。您的 bash 是否太旧而无法识别$((语法?可能。这是一个非常古老的 bash。

于 2013-08-10T06:18:56.670 回答
0

count=$((count+1))

if [ `echo $count % 100 | bc` -eq 0 ]

进行这些更正。

编辑:请尝试

count=`expr $count + 1`
于 2013-08-10T06:16:18.327 回答
0

我在这里看到一些错误。首先,你需要双引号$i,以防它们有特殊字符。

其次,你永远不应该使用

for i in `ls | sort -n`

相反,请尝试以下操作

ls -1 | sort -n | while read i

第三,将您的 if 语句更改为

if ((count%5 == 0))

语法是((bash 仅用于整数数学。

第四,将您的计数器增量更改为

((count++))

这更简洁。此外,您版本中的空间可能会破坏事物。请记住,空间很重要。

于 2013-08-10T06:20:03.090 回答