Shell脚本,从tt文件中读取列表,用作变量,使用该变量在foo循环中运行python脚本

Shell脚本,从tt文件中读取列表,用作变量,使用该变量在foo循环中运行python脚本

我正在尝试运行一个 shell 脚本,它从 txt 文件中读取变量,在 for 循环中使用该变量来运行 python 文件。

  1. 该代码读取一个txt文件,其中至少有100个变量,例如var1,var2,var3....var 100

  2. 该代码更改目录(Rep1、Rep2)以从每个目录 RepOut_Rep1.out 读取另一个文件

  3. 该代码运行 python 代码,从不同目录获取条目

    python /home/PhytonFiles/phytonFold.py  -s /home/mySFiles/$var -o $RepOut_Rep1.out -n summaryFile.txt
    

我写了下面的代码,但恐怕它不起作用

input="MyList.txt"
while IFS= read -r file; 
do
# printf '%s\n' "$file"
  
# run the script for the following directories (Rep1, Rep2. ...)
  for f in Rep1 Rep2
  do
  cd ${f}

#  pull the output file 
  outFile=RepOut_${f}.out

# create a summary folder at the end of the run
  summaryFile=summary_${f}_$file

# run the python file, get the inputs from /home/mySFiles/ with the variable $file
  phyton /home/PhytonFiles/phytonFile.py  -s /home/mySFiles/$file -o $outFile -n $summaryFile 

done 
done < "$input"

我不确定我在 python run 行中使用的变量是否正确。我哪里会犯错误?

感谢您的帮助。

比尔坎

答案1

实际上有一些事情阻止了它做你想做的事情。

  1. 最重要的是,在第 9 行,您 cd 到 Rep1,然后当 for 循环继续时,您无法 cd 到 Rep2,因为您仍在 Rep1 中

所以如果你的文件夹结构是

./
  ./Rep1
  ./Rep2

运行 python 脚本后,您需要 cd 返回到父文件夹。但说实话,不清楚为什么要使用 cd 命令,只是在 for 循环中写出整个文件路径。

  1. 您还把 python 拼写错误,因此 python 行可能从未被执行过。

  2. 如果您的意思是一个如下所示的变量文件:

VAR1=a VAR2=b VAR3=c ...

那么你会想要获取该文件而不是从中读取,但我根据脚本猜测该文件实际上并不是 bash 变量中的变量文件,而是一个文件名文件夹,例如

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

如果是这种情况,那么您需要确保始终将 $file 放在引号中,因为您不知道任何文件名是否有空格,并且 bash 在 python 行中打印类似的内容(如果有)任何空格:

phyton /home/PhytonFiles/phytonFile.py  -s /home/mySFiles/some file name.txt -o $outFile -n $summaryFile 

这会让 python 认为有这些选项:

-s /home/mySFiles/some
-o $outFile
-n $summaryFile

和这些论点

file
name.txt

这是脚本的一个版本,其中包含我刚刚描述的更改:)

#!/bin/bash

input="MyList.txt"
while IFS= read -r file;
do
# printf '%s\n' "$file"

  # run the script for the following directories (Rep1, Rep2. ...)
  for f in Rep1 Rep2
  do

  # pull the output file
  outFile="RepOut_${f}.out"
  printf "\noutFile:\t%s\n" "$outFile"

  # create a summary folder at the end of the run
  summaryFile="summary_${f}_$file"
  printf "summaryFile:\t%s\n" "$summaryFile"

  # run the python file, get the inputs from /home/mySFiles/ with the variable $file
  echo python /home/PhytonFiles/phytonFile.py  -s "/home/mySFiles/$file" -o "$outFile" -n "$summaryFile"
  done
done < "$input"

我还针对此类问题提供了一个很好的技巧,我将“echo”一词放在了 Python 行的前面。继续按原样运行它,它会让您预览该行每次迭代的外观。

一旦您认为正确,请从开头删除“echo”并再次运行它,它将实际执行代码。

祝你好运。

相关内容