1

如果文件中的分数小于 36,我有一个 bash 脚本可以将文件从一个位置复制到另一个位置。

我每个月运行一次这个脚本,它以前工作过,但现在我得到了错误:

line 5: [: -lt: unary operator expected

这是脚本:

#!/bin/bash
for f in `ls $1/*.html`
do
        score=`grep -o -P '(?<=ADJ. SCORE: )-?[0-9]?[0-9]' $f`
        if [ $score -lt 36 ]
                then cp $f $2
        fi
done

我不确定操作系统是否重要;我使用的是 OS X 10.7,过去我的 bash 脚本遇到了麻烦,这些脚本在 Linux 机器上运行良好。

提前致谢!

4

3 回答 3

1

sehe是对的,或者你可以这样做:

if [[ $score < 36 ]]
then
cp "$f" "$2"
fi
于 2013-07-09T23:25:17.507 回答
0

当没有匹配时发生这种情况,$score然后是空字符串。

一个简单的修复:

#!/bin/bash
for f in `ls $1/*.html`
do
        score=`grep -o -P '(?<=ADJ. SCORE: )-?[0-9]?[0-9]' $f`
        if [ -z $score ]
        then
            echo "No match in '$f'"
        else
            if [ "$score" -lt 36 ]
            then 
                cp "$f" "$2"
            fi
        fi
done

我认为您还需要更加了解 shell 脚本中的引用要求。

于 2013-07-09T22:53:14.887 回答
0

在我运行 Mountain Lion 版本 10.8.4 的 Mac 上,我看不到-P带有grep. 所以你可以使用perlfor 代替(重新使用你的大部分脚本):

#!/bin/bash

for f in "${1}"/*.html; do    # Don't parse ls
  score=$(perl -ne "print $& if /(?<=ADJ. SCORE: )-?[0-9]?[0-9]/" "$f")
  if [ "$score" -lt 36 ]; then 
    cp "$f" $2
  fi
done
于 2013-07-10T01:06:06.487 回答