我有一个命令,其形式为
#!/bin/bash
command -f hello.txt -f world.txt -f bonjour.txt
hello.txt
,world.txt
和bonjour.txt
是目录中的文件/directory
。
由于实际上有 50 或 60 个这样的文件(并且它们会发生变化),因此我想-f
在 之后生成“ ”部分command
。
-f
如果命令是(仅一个)的话,这将很容易
command -f hello.txt world.txt bonjour.txt
因为我会选择
command -f $(ls /directory)
是否有一种简单的方法来加入-f
和元素ls /directory
?
我正在寻找 Python 的等价物
"-f " + " -f ".join(['hello.txt', 'world.txt', 'bonjour.txt'])
其中['hello.txt', 'world.txt', 'bonjour.txt']
是生成的列表。
答案1
使用循环构建变量for
。
因为您使用的是 Bash,所以应该使用数组变量,因为命令行参数实际上是一个数组,而不是单个扁平字符串。这将避免各种与引用相关的问题:
args=()
for file in /directory/*; do
args+=(-f "${file##*/}")
done
mycommand "${args[@]}"
出于同样的原因,$(ls)
当可以使用内置通配符时,请避免使用*
。
如果您正在为基线 POSIX shell 编写而不是专门为 Bash 编写,则需要使用字符串变量,但仍可以使用它*
来获取文件名,以及for
将它们连接在一起:
args=""
for file in ...; do
args="$args ..."
done
mycommand $args
有更紧凑的方式来编写这个,但它们既不容易阅读,也不会显著加快速度。
答案2
我将使用 printf 进行自动扩展,如下所示:
command $( printf -- '-f %q ' *.txt )
这将导致如下命令,具体取决于目录中的 .txt 文件:
command -f hello.txt -f world.txt -f bonjour.txt