【发布时间】:2021-08-12 14:55:40
【问题描述】:
我有一个简单的 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)
【问题讨论】:
-
您的示例只是为了演示还是您实际上是在尝试呼应一个 glob?您的要求不是直接可能的,但通常有一些方法可以解决这个限制,具体取决于您真正想做的事情。
-
$(echo f*)根据IFS拆分成词;像"$(echo f*)"一样引用它会将输出转换为单个参数。你到底想要做什么——你有一个文件数组想要传递给script,还是传递给你?可能有一些方法可以将您的 glob 转换为数组然后使用它,但我需要更多上下文。 -
我主要是问,因为所提出的问题的解决方案是“只使用 glob”。
-
我编辑了我的问题。希望这可以澄清它。
-
命令变电站产生 a 字符串,而不是一系列值。包含空格的字符串绝不等同于由空格分隔的字符串列表。
shuf在某种意义上会产生一个以换行符分隔的字符串值,但该值不能保证每一行都对应一个完整的文件名,因为文件名可以包含换行符。