我正在尝试运行一个 shell 脚本,它从 txt 文件中读取变量,在 for 循环中使用该变量来运行 python 文件。
该代码读取一个txt文件,其中至少有100个变量,例如var1,var2,var3....var 100
该代码更改目录(Rep1、Rep2)以从每个目录 RepOut_Rep1.out 读取另一个文件
该代码运行 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
实际上有一些事情阻止了它做你想做的事情。
- 最重要的是,在第 9 行,您 cd 到 Rep1,然后当 for 循环继续时,您无法 cd 到 Rep2,因为您仍在 Rep1 中
所以如果你的文件夹结构是
./
./Rep1
./Rep2
运行 python 脚本后,您需要 cd 返回到父文件夹。但说实话,不清楚为什么要使用 cd 命令,只是在 for 循环中写出整个文件路径。
您还把 python 拼写错误,因此 python 行可能从未被执行过。
如果您的意思是一个如下所示的变量文件:
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”并再次运行它,它将实际执行代码。
祝你好运。