我有以下bash脚本:
#!/bin/bash
while read line
do
ORD=`echo $line | cut -c 7-21`
if [[ -r ../FASTA_SEC/${ORD}.fa ]]
then
WCR=`fgrep -o N ../FASTA_SEC/$ORD.fa | wc -l`
WCT=`wc -m < ../FASTA_SEC/$ORD.fa`
PER1=`echo print $WCR/$WCT.*100 | python`
WCTRIN=`fgrep -o N ../FASTA_SEC_EDITED/$ORD"_Trimmed.fa" | wc -l`
WCTRI=`wc -m < ../FASTA_SEC_EDITED/$ORD"_Trimmed.fa"`
PER2=`echo print $WCTRIN/$WCTRI.*100 | python`
PER3=`echo print $PER1-$PER2 | python`
echo $ORD $PER1 $PER2 $PER3 >> Log.txt
if [ $PER2 -ge 30 -a $PER3 -lt 10 ]
then
mv ../FASTA_SEC/$ORD.fa ./TRASH/$ORD.fa
mv ../FASTA_SEC_EDITED/$ORD"_Trimmed.fa" ./TRASH/$ORD"_Trimmed.fa"
fi
fi
done < ../READ/Data.txt
$ PER变量是浮点数,因为你可能已经注意到了,所以我不能在嵌套的if条件下使用它们。我想在python中进行这种条件迭代,但是我不知道它是如何在bash脚本中执行的,我也不知道如何将变量$ PER2和$ PER3的值导入到python中。我可以在同一个bash脚本中直接编写python代码,以某种方式调用python吗?
感谢您的帮助,第一次面对此问题。
答案 0 :(得分:1)
您可以使用python -c CMD
从命令行执行一段python代码。如果你想让bash插入你的环境变量,你应该在CMD周围使用双引号。
您可以通过调用sys.exit返回一个值,但请记住,Python中的true和false在bash中具有相反的含义。
所以你的代码是:
if python -c "import sys; sys.exit(not($PER2 > 30 and $PER3 < 10 ))"
答案 1 :(得分:0)
也许这会有帮助吗?
$ X=4; Y=7; Z=$(python -c "print($X * $Y)")
$ echo $Z
28
python -c "str"
将"str"
作为输入并运行它。
但是为什么不在python中重写所有内容?使用subprocess
可以很好地执行bash命令,它包含在python中或(需要安装)sh
。
答案 2 :(得分:0)
可以借助here document语法将Python代码提供给python
可执行文件的标准输入:
variable=$(date)
python2.7 <<SCRIPT
print "The current date: %s" % "${variable}"
SCRIPT
为了避免参数替换(块内的解释),引用第一个限制字符串:<<'SCRIPT'
。
如果要将输出分配给变量,请使用command substitution:
output=$(python2.7 <<SCRIPT
print "The current date: %s" % "${variable}"
SCRIPT
)
请注意,建议不要使用后引号进行命令替换,因为无法嵌套它们,并且$(...)
形式更具可读性。