pfn*_*sel 2 bash command-substitution
我有一个简单的 bash 脚本,它只输出作为位置参数提供给脚本的文件名:
#!/usr/bin/env bash
for file; do
echo "$file"
done
Run Code Online (Sandbox Code Playgroud)
假设我有带空格的文件(比如“f 1”和“f 2”)。我可以使用通配符调用脚本并获得预期的输出:
$ ./script f*
> f 1
> f 2
Run Code Online (Sandbox Code Playgroud)
但是如果我使用命令替换它不起作用:
$ ./script $(echo f*)
> f
> 1
> f
> 2
Run Code Online (Sandbox Code Playgroud)
当我的命令替换输出多个带空格的文件名时,如何正确引用?
编辑:我最终想要的是以随机顺序将文件名传递给脚本(这比仅仅回显它们的名称要复杂一些),例如:
./script $(ls f* | shuf)
Run Code Online (Sandbox Code Playgroud)
使用 GNUshuf和 Bash 4.3+:
readarray -d '' files < <(shuf --zero-terminated --echo f*)
./script "${files[@]}"
Run Code Online (Sandbox Code Playgroud)
其中--zero-terminated可以处理任何文件名,并且readarray还使用空字节作为分隔符。
使用readarray不支持该-d选项的旧 Bash :
while IFS= read -r -d '' f; do
files+=("$f")
done < <(shuf --zero-terminated --echo f*)
./script "${files[@]}"
Run Code Online (Sandbox Code Playgroud)
在包含许多文件的极端情况下,这可能会遇到命令行长度限制;在这种情况下,
shuf --zero-terminated --echo f*
Run Code Online (Sandbox Code Playgroud)
可以替换为
printf '%s\0' f* | shuf --zero-terminated
Run Code Online (Sandbox Code Playgroud)
向Socowi提出建议--echo。