gpt4 book ai didi

bash - 引用命令替换的正确方法

转载 作者:行者123 更新时间:2023-12-05 09:04:23 27 4
gpt4 key购买 nike

我有一个简单的 bash 脚本,它只输出作为位置参数提供给脚本的文件名:

#!/usr/bin/env bash

for file; do
echo "$file"
done

假设我有带空格的文件(比如“f 1”和“f 2”)。我可以使用通配符调用脚本并获得预期的输出:

$ ./script f*
> f 1
> f 2

但如果我使用命令替换,它就不起作用:

$ ./script $(echo f*)
> f
> 1
> f
> 2

当我的命令替换输出多个带空格的文件名时,如何才能正确引用?

编辑:我最终想要的是以随机顺序将文件名传递给脚本(这比仅仅回显它们的名字稍微复杂一些),例如类似的东西:

./script $(ls f* | shuf)

最佳答案

使用 GNU shuf 和 Bash 4.3+:

readarray -d '' files < <(shuf --zero-terminated --echo f*)
./script "${files[@]}"

其中 --zero-terminated 可以处理任何文件名,readarray 也使用空字节作为分隔符。

对于旧的 Bash,其中 readarray 不支持 -d 选项:

while IFS= read -r -d '' f; do
files+=("$f")
done < <(shuf --zero-terminated --echo f*)
./script "${files[@]}"

在有很多文件的极端情况下,这可能会遇到命令行长度限制;在这种情况下,

shuf --zero-terminated --echo f*

可以替换为

printf '%s\0' f* | shuf --zero-terminated

Socowi 致敬用于指出 --echo

关于bash - 引用命令替换的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68759751/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com