迭代输入文件,但在 bash 脚本中分组处理它们

uni*_*orn 3 bash shell-script

例如,我有多个带有名称的文件

ahard.txt
asoft.txt
bhard.txt
bsoft.txt
chard.txt
csoft.txt
Run Code Online (Sandbox Code Playgroud)

我想循环这些文件,但分组处理它们,以便Xhard.txt和用作输入文件和输出文件,其中字母代表、等(它实际上是文件名中的单个字母)。 aXsoft.txtX.txtXabc

我努力了:

#!/bin/bash

i=$(ls *.txt)

for x in $i
do
    pipeline nser=2 input1="${x/soft.txt}" input2="${x/hard.txt}" outfile="${x/hard.txt}"
done
Run Code Online (Sandbox Code Playgroud)

cho*_*oba 7

您可以使用参数扩展来提取文件名的第一个字符:

#! /bin/bash
for soft in ?soft.txt ; do
    letter=${soft:0:1}
    hard=${letter}hard.txt
    if [[ ! -f $hard ]] ; then
        echo "$hard not found" >&2
        continue
    fi
    echo "$soft $hard $letter.txt"
done
Run Code Online (Sandbox Code Playgroud)
  • ${soft:0:1}返回(位置 0,长度 1)的第一个字符$soft

请注意,它不会报告缺少 Xsoft 的 Xhard。

顺便说一句,使用$(ls ...)几乎总是错误的。如上面的代码片段所示迭代扩展的 glob,或者直接填充数组而不使用ls

files=(*.txt)
Run Code Online (Sandbox Code Playgroud)