考虑变量files
:
$ echo $files
1.txt 2.txt 3.txt
有没有办法告诉grep它必须对单个字符串中出现在变量中的每个文件进行grep?我试过了:
$ grep "string" "$files"
但是我得到一个1.txt 2.txt 3.txt No such file of directory
错误。自从我使用外壳进行工作以来已经有一段时间了,所以我不记得如何进行这项工作。
带有存储在中的文件名列表files
,例如
files="1.txt 2.txt 3.txt"
当你引用"$files"
(做好引用您的变量),并尝试使用"$files"
与grep
命令字分割上的内容$files
不会发生?为什么?报价可以防止单词分裂,因此会grep
尝试查找命名"1.txt 2.txt 3.txt"
为当然不会退出并生成错误的文件。
你可以用grep
与$files
简单地使用$files
未引用-但这不是要走的路。为什么?存储用于命令的文件名时,必须确保存储的文件集合可以处理所有有效的文件名。这包括带空格的文件名。如果您尝试将无引号的方法用于:
files="file 1.txt file 2.txt file 3.txt"
使用grep
(或任何命令)与未加引号$files
将失败找6个文件,file
,1.txt
,file
,2.txt
,file
,3.txt
。
在BashFAQ#50中,特别是在5中详细描述和讨论了这个问题。我正在基于仅在运行时才知道的信息构造命令。解决方案是将文件名存储在数组中(如果需要存储的话)。正如@Jetchisel指出的那样,可以通过简单地将其创建files
为数组来处理:
files=(*.txt)
(或files=([1-3].txt)
来限制选择到1.txt
,2.txt
,3.txt
)
通过使用数组,您可以使用带引号的形式,"${files[@]}"
该形式将为单独引用的命令提供每个文件名,例如
grep "string" "${files[@]}"
将扩展为:
grep "string" "1.txt" "2.txt" "3.txt"
这样,无论文件名是什么,无论文件名是否包含空格,grep
都将看到正确的文件名。例如:
files=("file 1.txt" "file 2.txt" "file 3.txt")
使用带引号的数组形式grep
将导致:
grep "strings" "file 1.txt" "file 2.txt" "file 3.txt"
因此,您最初的问题是由抑制单词拆分引起的,但是您尝试使用文件名列表本身就很成问题。如果您需要捕获变量中的文件名列表,则出于上述原因,请使用数组。如果您可以避免将它们全部存储起来,而只是将grep
命令与glob这样的glob一起使用*.txt
,则可以避免这两个问题开始。
如果您还有其他问题,请告诉我。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句