我发现了一个旧的过去的纸质问题,其内容未在我的课程中涵盖。我希望我不会接受检查,但这个bash脚本做了什么?我知道grep接受用户输入并输出包含输入的行,echo只重复输入,cat只显示输入。但是我已经知道它作为一个整体做了什么。有什么帮助吗?
#!/bin/bash
outputFile=$1
for file in $(find -name '*txt' | grep data)
do
echo $file >> $outputFile
cat $file >> $outputFile
done
答案 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"