1

有人可以帮我检查我的 bash 脚本吗?我正在尝试将 .txt 文件的目录提供给 stanford 解析器(http://nlp.stanford.edu/software/pos-tagger-faq.shtml),但我无法让它工作。我正在开发 ubuntu 10.10

循环正在工作并读取正确的文件:

#!/bin/bash -x
cd $HOME/path/to
for file in 'dir -d *'
do
#       $HOME/chinesesegmenter-2006-05-11/segment.sh ctb $file UTF-8
        echo $file
done

但与

#!/bin/bash -x
cd $HOME/yoursing/sentseg_zh
for file in 'dir -d *'
do
#       echo $file
        $HOME/chinesesegmenter-2006-05-11/segment.sh ctb $file UTF-8
done

我收到此错误:

alvas@ikoma:~/chinesesegmenter-2006-05-11$ bash segchi.sh
Standard: CTB
File: dir
Encoding: -d
-------------------------------
Exception in thread "main" java.lang.NoClassDefFoundError: edu/stanford/nlp/ie/crf/CRFClassifier
Caused by: java.lang.ClassNotFoundException: edu.stanford.nlp.ie.crf.CRFClassifier
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: edu.stanford.nlp.ie.crf.CRFClassifier. Program will exit.

以下命令有效:

~/chinesesegmenter-2006-05-11/segment.sh ctb ~/path/to/input.txt UTF-8

并输出这个

alvas@ikoma:~/chinesesegmenter-2006-05-11$ ./segment.sh ctb ~/path/to/input.txt UTF-8
Standard: CTB
File: /home/alvas/path/to/input.txt
Encoding: UTF-8
-------------------------------
Loading classifier from data/ctb.gz...done [1.5 sec].
Using ChineseSegmenterFeatureFactory
Reading data using CTBSegDocumentReader
Sequence tagging 7 documents
如果 您 在 新加坡 只 能 前往 一 间 俱乐部 , 祖卡 酒吧 必然 是 您 的 不二 选择 。

作为新加坡唯一一家国际知名的夜店,卡既是一城的公共机构,也是一城的一个公共机构,也是一个供成人礼等庆祝的不二场所。</p>

4

3 回答 3

3

除了:应该是;一行或新行的 (colon) 之外,the'dir -d *'不会做你认为它做的事情 - 循环只会有一次迭代,其中file是一个长字符串,以你的所有文件开头dir -d和之后。此外,您最初更改为基于$file但随后在循环中重用该变量的路径file,这是可疑的。我不得不猜测你的意图,但它可以更简单,例如:

#!/bin/bash
cd ~/path/to/whereever
for file in *
do
     ~/chinesesegmenter-2006-05-11/segment.sh ctb "$file" UTF-8
done

即使您使用带有反引号的(更正确的)版本:

for file in `dir -d *`

...它仍然有资格获得ls * 奖的无用使用;)

更新:最初我忘了引用$file,正如另一个答案中指出的那样

于 2011-03-11T08:39:39.233 回答
2

你可以试试:

for file in *
do
    $HOME/segment.sh ctb "$file" UTF-8
done

所以有几点需要纠正:

  • 不要:在 for 语句后使用,使用;或换行符
  • 在对象周围加上引号"$file"以允许文件名中有空格
  • 如果你想在你放置的地方使用一个命令,'dir -d *'你应该使用$(dir -d *)or 角度的引号来代替 ``
于 2011-03-11T08:29:27.717 回答
1
for file in 'dir -d *': do

你用冒号代替了分号。

如果你想要一个简单的调试,你可以添加-x一个选项到你的 shebang :

#!/bin/bash -x

错误将更容易被发现。

于 2011-03-11T08:34:29.970 回答