Shell脚本循环使用相同名称但扩展名不同的文件

时间:2015-06-15 18:59:20

标签: linux bash shell

例如说我有:

filename1.ext1 filename1.ext2 filename2.ext1 filename2.ext2

我需要编写一个shell脚本来将这些文件提供给类似的程序:

program filename1.ext1 filename1.ext2
program filename2.ext1 filename2.ext2

此外,必须先输入.ext1个文件,然后输入.ext2个文件。

任何帮助都将不胜感激。

3 个答案:

答案 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.ayour_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来测试相应的文件是否存在。