在For Loop(Bash)中使用变量名称

时间:2018-12-17 22:23:15

标签: linux bash

我有两组目录。在第一个目录中,我有8个这样的文件:

file1.txt file2.txt file3.txt ... file8.txt

在第二个目录output中,我有多个子目录。我想编写一个output内每个子目录中的for循环(因此它们是directory1directory2等)并读取一个名为database_file_#.txt的文件。目前,我已在下面编写了此循环,但一次仅适用于一个目录。

for file in *; do 
name="${file%%.*}"
python script.py --parameter $file --out ../../output/directory1/${cts_name} 
--readin ../../output/directory1/database_file_1.txt 
done

对于第二个目录,我执行以下操作:

 for file in *; do 
name="${file%%.*}"
python script.py --parameter $file --out ../../output/directory1/${cts_name} 
--readin ../../output/directory2/database_file_2.txt 
done

我不想继续为输出中的所有目录重写目录号。有没有办法我可以使用变量?

3 个答案:

答案 0 :(得分:1)

for i in 1 2 3 4 5 6 7 8; do 
  for file in *; do 
    name="${file%%.*}"
    python script.py --parameter "$file" --out ../../output/directory"${i}/${cts_name}" \
        --readin "../../output/directory${i}/database_file_${i}.txt" 
  done
done

答案 1 :(得分:0)

听起来这里的关键变量是“#”,而不是“文件”。

建议:

for i in 1 2 3 4 5 6 7 8; do 
  filename=file$i.txt
  outdir=../../output/directory$i
  python script.py --parameter $filename --out $outdir/${cts_name} --readin $outdir/database_file_$i.txt 
done

PS:假设输入文件和#之间存在1 :: 1的关系。

否则,如果每个#都有N个文件,则需要一个嵌套循环。

在任何情况下,请使其尽可能简单(KISS)。

答案 2 :(得分:0)

首次尝试时,您可以尝试以下操作(但请继续阅读):

for f in $(ls -R); do
  if [[ $f =~ database_file_+([0-9])\.txt ]]; then
    python script.py ... --readin "$f"
  fi
done

+([0-9])与一个或多个数字匹配的地方

感谢查尔斯·达菲的评论,此摘要更加准确:

find . -type f -regex ".*/database_file_[0-9]+\.txt$" -exec python script.py ... --readin {} \;