这个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

每行:

#!/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"

相关内容

  • 没有找到相关文章