如何为bash中传递给循环的每个文件创建一个输出文件?

时间:2017-07-21 18:29:09

标签: bash terminal

我有一个文件,我传递给bash命令,它将在循环中创建一个输出,如下所示:

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

我希望将每个循环中标准输出的输出保存到工作目录中的文本文件中。目前我正在尝试这个:

var palindrome = word => word == word.split('').reverse().join('')

我希望看到的是在我当前目录中创建的新文件,名为file1.txt_commandoutput.txt,file2.txt_commandoutput.txt等。该命令的输出应保存为每个文件的不同文件。但是我只创建了一个文件,它被称为" .txt"并且无法通过Mac上的任何标准软件打开。我是bash脚本的新手,所以非常感谢帮助!

感谢。

3 个答案:

答案 0 :(得分:2)

您的问题来自您正在使用的变量名称:

"$file_command_output.txt"查找名为file_command_output的变量(点不能在变量名中,但是字母数字字符和下划线都可以)。

您要查找的内容是"${file}_command_output.txt",以使变量名称更加明确。

答案 1 :(得分:0)

如果您不了解xargs,请尝试以下操作:

$ ls
file
$ cat > file
one
two
three
$ while read this; do touch $this; done < ./file
$ ls
file  one  three  two

答案 2 :(得分:0)

您的脚本中有两个问题。

首先,扩展了错误的参数/变量(file_command而不是file),因为它后跟一个可以解释为名称一部分的字符(下划线,_ )。要解决此问题,请将参数名称括在大括号中,如下所示:${file}_command(请参阅bash手册中的Shell Parameter Expansion)。

其次,即使使用固定变量名称扩展,也不会在工作目录中创建该文件,因为file包含绝对路径名(/file/list/name)。要解决此问题,您必须从路径名中删除目录。您可以使用basename命令执行此操作,甚至可以使用修改后的shell参数扩展来删除最长的匹配前缀,如下所示:${file##*/}(再次参阅Shell Parameter Expansion,部分请参阅${parameter##word})。

全部放在一起,您的脚本现在看起来像:

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

此外,要将命令输出保存到文件而不在终端中打印,您可以使用简单的redirection而不是tee,如下所示:command > "${file##*/}_com..."。< / p>