如何使用 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/./\\&amp;/' 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 $(&lt;.package-list) 在 bash 中,您甚至可以使用 set -o noglob 禁用 glob,以确保在遇到 *?[] 等特殊字符时安全。 真的,@KamilCuk。我实际上希望能够通过IFS=$'\n' go test -coverprofile=coverage.out $(&lt;.package-list)IFS 设置一个临时值,但显然不是。 另一个好建议,@Socowi 是的,很遗憾IFS=... cmd1 $(cmd2) 不起作用,因为IFS 只为cmd1 的环境设置,而不是为执行cmd1 $(cmd2) 的当前shell 设置。要对 IFSset 进行本地更改,您可以使用子 shell:( IFS=$'\n'; set -o noglob; go test ...; )【参考方案4】:

另一种选择:

go test -coverprofile=coverage.out $(cat .package-list | tr '\n' ' ')

【讨论】:

以上是关于如何使用 SH 从文本文件创建列表?的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中使用 pandas 从文本文件创建列表

从列表列表创建字典

在 python 中读取文本文件并从中创建两个列表

Python:从文本文件中逐字符创建一个字符串数组[关闭]

所以我刚刚创建了一个文本文件并使用 with 循环从现有文件中复制了文本。如何在同一个 prog 中打开新创建的文件?

如何将长文本文件字段放入列表框?