循环中的基本名称问题

循环中的基本名称问题

我是 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

相关内容