我有一个 bash 脚本,它执行以下操作:
java -jar executablefile.jar --width 100 --speed 50 --ouput outfile.mp4 --input file1.dat file2.dat file3.dat (etc)
我可以像这样读取目录中的所有文件:
dir=~/location/to/files
for f in "$dir"/*; do
echo "$f"
done
上面的测试显示了所有文件。这样我就可以一次将一个文件放入 $f 中。但是我需要(可能在那个循环中)将每个文件名字符串(包括我相信的路径)连接到一个我可以使用的变量中,如下所示:
java -jar executablefile.jar --width 100 --speed 50 --ouput outfile.mp4 --input $listOfFileNamesWithSpaceBetweenEachFile
我这辈子都找不到这样的东西了。有人有什么建议吗?
谢谢。
更新 经过沟通,事实证明我有点错了。它需要是这样的:
-- input /path/to/filename1.gpx --input /path/to/filename2.gpx --input /path/to/filename3.gpx etc
所以我能够通过以下方式获取字符串:
VAR=""
dir=~/location/to/files
for f in "$dir"/*; do
echo ${f}
VAR+="--input ${f} "
done
`
感谢大家的帮助!
答案1
如果您在 shell 命令行上运行此命令:
somecommand --input file1.dat file2.dat file3.dat
然后somecommand
将得到 4 个参数--input
和三个文件名。你可以做同样的事情
somecommand --input file*.dat
globfile*.dat
将扩展为文件名列表,每个文件名都有一个单独的参数somecommand
.
所以,
java ... --input ~/location/to/files/*
可能是也可能不是您需要做的全部。
现在,您可以有一个像这样的变量var="foo.txt bar.txt"
,并将其不加引号地使用,以将其用作蹩脚列表,但是当某些文件名包含空格(或更糟)时,这就会遇到麻烦。
相反,使用数组:
files=(foo.txt bar.txt)
somecommand --input "${files[@]}"
或者
files=(foo*.txt) # expands each filename to a distinct array element.
somecommand --input "${files[@]}"
看我们如何运行存储在变量中的命令?有关其他详细信息,包括。增量构建阵列。
在编辑中,您说该命令需要--input file1 --input file2 ...
改为,就像带参数的命令行选项如何工作一样。
在这种情况下,您需要在数组中构建参数,如下所示:
args=()
dir=~/location/to/files
for f in "$dir"/*; do
args+=(--input "$f")
done
并再次运行命令
somecommand ... "${args[@]}"