我是 shell 脚本编程的新手,我正在尝试执行一个读取文本并执行其 POS 标记的软件。它需要一个输入和一个输出,如执行示例中所示:
$ cat input.txt | /path/to/tagger/run-Tagger.sh > output.txt
我想做的是不仅对文本执行此行,而且对特定文件夹中的一组文本执行此行,并返回与输入文件同名的输出文件。所以,我尝试编写这个脚本:
#!/bin/bash
path="/home/rafaeldaddio/Documents/"
program="/home/rafaeldaddio/Documents/LX-Tagger/POSTagger/Tagger/run-Tagger.sh"
for arqin in '/home/rafaeldaddio/Documents/teste/*'
do
out=$(basename $arqin)
output=$path$out
cat $arqin | $program > $output
done
我只用一个文件尝试过,它可以工作,但是当我尝试使用多个文件时,我收到此错误:
basename: extra operand ‘/home/rafaeldaddio/Documents/teste/3’
Try 'basename --help' for more information.
./scriptLXTagger.sh: 12: ./scriptLXTagger.sh: cannot create /home/rafaeldaddio/Documents/: Is a directory
对我做错了什么有什么见解吗?谢谢。
答案1
你已经用单引号括起来了'/home/rafaeldaddio/Documents/teste/*'
。这意味着它正在寻找名为*
inside 的单个文件teste
。 (我怀疑你有这样的文件,或者这就是你想要的!)。
这意味着您的for
循环正在使用单个条目运行,并将该文件传递*
给基本名称。
然后,out=$(basename $arqin)
进行扩展,out=$(basename file1 file2 file3 ... fileN)
当然对于 basename 来说参数太多了。
简单的解决方案:去掉 around 的引号/home/rafaeldaddio/Documents/teste/*
。
答案2
@BenXO 已经告诉你为什么失败了,但你实际上并不需要一个脚本来完成这么简单的事情。您可以将其直接粘贴到命令行中:
for arqin in /home/rafaeldaddio/Documents/teste/*; do
cat "$arqin" |
/home/rafaeldaddio/Documents/LX-Tagger/POSTagger/Tagger/run-Tagger.sh > \
/home/rafaeldaddio/Documents/$(basename "$arqin");
done
或者,因为如果cat foo | program
有效,program foo
几乎肯定也有效,并且假设这/home/rafaeldaddio/
是您的主目录,您可以简化为:
for arqin in ~/Documents/teste/*; do
~/Documents/LX-Tagger/POSTagger/Tagger/run-Tagger.sh "$arqin" > \
~/Documents/$(basename "$arqin");
done