ループのデフォルト名の問題

ループのデフォルト名の問題

私はシェルスクリプトに初めてアクセスし、テキストを読み、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

1つのファイルでのみ試しましたが、正常に動作しましたが、複数のファイルで試してみると、次のエラーが発生します。

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のパラメータが多すぎます。

簡単な解決策:周囲の引用符を削除してください/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

関連情報