2017-07-21 10 views
0

私はそうのようなループで出力を作成します。bashコマンドに渡すファイルがあります:私はテキストに各ループのうち、標準に行っていた出力を保存したいbashでループに渡された各ファイルの出力ファイルを作成する方法は?

for file in /file/list/* 
do 
    command 
done 

を私の作業ディレクトリにあるファイル。現在、私はこれをしようとしています:

for file in /file/list/* 
do 
    command | tee "$file_command output.txt" 
done 

を私が見ることを期待し、どのコマンドの出力は、として保存しなければならないなど、私の現在のディレクトリと題しfile1.txt_commandoutput.txt、file2.txt_commandoutput.txt、で作成された新しいファイルがありますファイルごとに異なるファイル。しかし、私は一つのファイルしか作成せず、 ".txt"と呼ばれ、Mac上の標準ソフトウェアでは開くことができません。私はスクリプティングをbashするのが初めてだから、助けてくれれば幸いです!

ありがとうございました。

"$file_command_output.txt"file_command_outputという名前の変数を探します(ドットが変数名にすることはできませんが、英数字とアンダースコアのすべての缶):

+0

'各ファイルの... 'は不適切な' bash'構文です... – twalberg

+0

入力エラーです。それを指摘していただきありがとうございます。 –

答えて

0

あなたのスクリプトに2つの問題を抱えています。

最初に、間違ったパラメータ/変数は、名前の一部(アンダースコア、_)の後に続く文字の後に展開されるため、の代わりにに展開されます。これを修正するには、のように、パラメータ名を中括弧で囲みます。${file}_commandShell Parameter Expansionbashのマニュアルに記載しています)。

固定変数名展開でも、fileには絶対パス名(/file/list/name)が格納されているため、作業ディレクトリにファイルは作成されません。それを修正するには、ディレクトリをパス名から削除する必要があります。 basenameコマンドで行うこともできますし、${file##*/}のように最長の一致する接頭辞を削除する変更されたシェルパラメータ拡張を使用することもできます(もう一度Shell Parameter Expansion、セクション${parameter##word}を参照)。

すべて一緒に入れ、あなたのスクリプトは、今のようになります、代わりにteeの、ちょうどターミナルでそれを印刷することなく、あなたが簡単なredirectionを使用することができ、コマンド出力をファイルに保存するために、また

#!/bin/bash 
for file in /file/list/* 
do 
    command | tee "${file##*/}_command output.txt" 
done 

このように:command > "${file##*/}_com..."

2

あなたの問題は、あなたが使用している変数名に由来しています。

あなたが探しているのは、変数名をより明示的にするために"${file}_command_output.txt"です。

0

あなたがxargsを認識していない場合は、これを試してみてください。

$ ls 
file 
$ cat > file 
one 
two 
three 
$ while read this; do touch $this; done < ./file 
$ ls 
file one three two 
関連する問題