如何使用 SH 从文本文件创建列表?
Posted
技术标签:
【中文标题】如何使用 SH 从文本文件创建列表?【英文标题】:How to create a list from a text fille using SH? 【发布时间】:2021-11-22 14:09:29 【问题描述】:我需要创建一个 SH 脚本来读取包含目录列表的文件
dirA
dirB
dirC
并使用此信息生成如下命令:
go test -coverprofile=coverage.out dirA dirB dirC
包文件名为.package-list
,这是我目前拥有的脚本:
while read package;
do
go test -coverprofile=coverage.out ./$package
done <.package-list
问题是该脚本执行了三次go test
命令:
go test -coverprofile=coverage.out ./dirA
go test -coverprofile=coverage.out ./dirB
go test -coverprofile=coverage.out ./dirC
如何读取文件并生成我需要的命令?
【问题讨论】:
使用xargs
命令
【参考方案1】:
如果使用bash
而不是sh
(您都已标记,因此不清楚您的目标是哪个shell),您可以将文件的行读入数组:
readarray -t packages < .package-list
go test -coverprofile=coverage.out "$packages[@]"
【讨论】:
【参考方案2】:使用xargs
xargs go test -coverprofile=coverage.out < .package-list
【讨论】:
注意xargs
' 参数拆分和引用机制。对于 GNU xargs,请使用 xargs -d \\n …
以确保安全。对于其他实现,请使用sed 's/./\\&/' file | xargs …
。您可能还想添加-x
。【参考方案3】:
如果你的文件不是很大,你可以一次将整个文件读入一个数组,只要目录名本身不包含换行符:
IFS=$'\n' # To split on new lines only
dirs=( $(<.package-list) )
go test -coverprofile=coverage.out "$dirs[@]"
【讨论】:
Weeell,那么使用数组没有意义,只需IFS=$'\n' ; go test -coverprofile=coverage.out $(<.package-list)
在 bash 中,您甚至可以使用 set -o noglob
禁用 glob,以确保在遇到 *?[]
等特殊字符时安全。
真的,@KamilCuk。我实际上希望能够通过IFS=$'\n' go test -coverprofile=coverage.out $(<.package-list)
为IFS
设置一个临时值,但显然不是。
另一个好建议,@Socowi
是的,很遗憾IFS=... cmd1 $(cmd2)
不起作用,因为IFS
只为cmd1
的环境设置,而不是为执行cmd1 $(cmd2)
的当前shell 设置。要对 IFS
和 set
进行本地更改,您可以使用子 shell:( IFS=$'\n'; set -o noglob; go test ...; )
。【参考方案4】:
另一种选择:
go test -coverprofile=coverage.out $(cat .package-list | tr '\n' ' ')
【讨论】:
以上是关于如何使用 SH 从文本文件创建列表?的主要内容,如果未能解决你的问题,请参考以下文章