例如说我有:
filename1.ext1 filename1.ext2 filename2.ext1 filename2.ext2
我需要编写一个shell脚本来将这些文件提供给类似的程序:
program filename1.ext1 filename1.ext2
program filename2.ext1 filename2.ext2
此外,必须先输入.ext1
个文件,然后输入.ext2
个文件。
任何帮助都将不胜感激。
答案 0 :(得分:0)
脚本程序:
#!/bin/bash
for file in "$@";do
echo "$file"
done
运行程序:
path/to/program filename1.*
path/to/program filename1.* filename2.*
path/to/program filename1.ext1 filename1.ext2
etc...
答案 1 :(得分:0)
anubhava的解决方案非常出色,如果在您的示例中,扩展按照正确的顺序进行排序。对于更一般的情况,在不能依赖排序的情况下,我们可以明确指定参数顺序:
for f in *.ext1
do
program "$f" "${f%.ext1}.ext2"
done
即使文件名中包含空格或其他困难字符,这也会有效。
答案 2 :(得分:0)
有几种方法可以解决这个问题。
如果你想处理your_script foo.a foo.b bar.a bar.b
(序列中的参数对):
#!/bin/bash
while [[ $# -gt 2 ]]; do
program "$1" "$2"
shift 2
done
但是如果你想要列出匹配名称的列表,你甚至不需要接受第二组扩展。将其称为your_script foo.a bar.a
或your_script *.a
:
#!/bin/bash
for FILE1; do # same as: for FILE1 in "$@"; do
FILE2="${FILE1%.ext1}.ext2" # removes .ext1 if it exists and adds .ext2
program "$FILE1" "$FILE2"
done
请注意,上述内容不能处理丢失的文件。您可以使用if [[ -f $FILE2 ]]; then program; fi
来测试相应的文件是否存在。