我发现了一个以前的论文问题,内容在我的课程中没有涉及。我希望我不会被检查,但这个bash脚本是做什么的?我知道grep接受用户输入并输出包含输入的行,echo只是重复输入,cat只是显示输入。但我不知道这是怎么回事。请帮忙吗?
#!/bin/bash
outputFile=$1
for file in $(find -name '*txt' | grep data)
do
echo $file >> $outputFile
cat $file >> $outputFile
done
每行:
#!/bin/bash
哈希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 Loop
不过这个脚本有一些问题。如果$outputFile或$file的名称或路径中有空格,则它将失败。在变量周围加双引号是一种很好的做法,比如:
cat "$file" >> "$outputFile"
#!/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
并运行循环。如果找到的任何名称中都有空格或glob字符,这可能会崩溃。最好使用find
的本机-exec
标志来处理此问题。
echo $file >> $outputFile
将变量"file"的展开追加到通过展开$outputFile
找到的路径上的新文件或现有文件中。如果前一个扩展以破折号开头,可能会导致echo
将其视为一个参数。如果后一个扩展中有空白或glob字符,这可能会导致"不明确的重定向"错误。最好引用展开式,并使用printf
来避免echo
的参数边缘情况,如printf '%sn' "$file" >> "$outputFile"
中所示。
cat $file >> $outputFile
将在变量"file"的扩展中找到的文件的内容附加到通过扩展$outputFile
找到的路径,或者导致另一个不明确的重定向错误。最好引用扩展名,如cat "$file" >> "$outputFile"
。
假设前面提到的扩展边缘案例都不是预期的,那么最好这样写整个脚本:
find . -name '*data*txt' -print -exec cat {} ; >> "$1"