web-dev-qa-db-ja.com

ループ内のbasenameの問題

私はシェルスクリプトプログラミングに不慣れで、テキストを読み取って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

私が間違っていることについての洞察はありますか?ありがとう。

2
user2272708

_'/home/rafaeldaddio/Documents/teste/*'_を一重引用符で囲みます。これは、teste内で_*_という単一のファイルを探していることを意味します。 (私はあなたがそのようなファイルを持っているとは思わない、またはそれはあなたが意図したものです!).

これは、forループが単一のエントリで実行され、そのファイル_*_がbasenameに渡されることを意味します。

次に、out=$(basename $arqin)out=$(basename file1 file2 file3 ... fileN)に展開されます。これはもちろんbasenameの引数が多すぎます。

簡単な解決策:引用符を_/home/rafaeldaddio/Documents/teste/*_付近から削除します。

5
Ben XO

@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

または、if 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
1
terdon