这个bash脚本的每一行有什么作用?

时间:2016-05-22 18:53:54

标签: bash

我发现了一个旧的过去的纸质问题,其内容未在我的课程中涵盖。我希望我不会接受检查,但这个bash脚本做了什么?我知道grep接受用户输入并输出包含输入的行,echo只重复输入,cat只显示输入。但是我已经知道它作为一个整体做了什么。有什么帮助吗?

#!/bin/bash

outputFile=$1
for file in $(find -name '*txt' | grep data)
do
  echo $file >> $outputFile
  cat $file >> $outputFile
done

2 个答案:

答案 0 :(得分:1)

每一行:

#!/bin/bash

Hash-bang脚本使用bash

outputFile=$1

设置名为" outputFile"的变量。传递给脚本的第一个参数。运行脚本看起来像bash myScript.sh "/some/file/to/output.txt"

for file in $(find -name '*txt' | grep data)
do

遍历此目录中的每个文件及其子目录,查找以字符" txt"结尾的文件。并包含字符" data"名字的某个地方。对于找到的for循环/文件的每次迭代,将文件名设置为变量" file"

  echo $file >> $outputFile

回显/打印存储在变量" file"中的文件名。到outputFile

  cat $file >> $outputFile

获取文件的内容并将其粘贴在outputFile中。

done

结束For循环

但是这个脚本存在一些问题。如果$ outputFile或$ file在其名称或路径中有空格,则它将失败。在诸如以下变量之间抛出双引号是一种很好的做法:

cat "$file" >> "$outputFile"

答案 1 :(得分:1)

#!/bin/bash

shebang。如果此脚本是可执行的,可直接在./this_script中调用或在PATH中找到,则将使用/bin/bash调用该脚本。

outputFile=$1

将第一个参数分配给名称outputFile

++ find -name '*txt'

递归列出名称以" txt"结尾的所有文件。包含路径并将其写为find . -name '*.txt'

将更为标准
+ … | grep data

过滤上一个文件名列表。只列出那些包含字符串" data"在他们的名字。可以通过编写find . -name '*data*txt'来删除此管道。

for file in $(find -name '*txt' | grep data)

对于find | grep管道输出中的每个,将该字分配给名称file并运行循环。如果找到的任何名称中包含空格或全局字符,则可能会崩溃。最好使用find的原生-exec标志来处理此问题。

  echo $file >> $outputFile

追加变量" file"的扩展。通过展开$outputFile找到的路径中的新文件或现有文件。如果前一个扩展以短划线开始,则可能导致echo将其视为参数。如果后一个扩展中包含空格或全局字符,则可能会导致重定向不明确的重定向"错误。引用扩展会更好,并使用printf来避免参数edge-case到echo,就像printf '%s\n' "$file" >> "$outputFile"一样。

  cat $file >> $outputFile

追加变量"文件"的扩展中找到的文件内容。通过展开$outputFile找到的路径,或导致另一个模糊的重定向错误。引用扩展名称会更好,例如cat "$file" >> "$outputFile"

假设没有预期的上述扩展边缘情况,最好像这样编写整个脚本:

find . -name '*data*txt' -print -exec cat {} \; >> "$1"