查看原文
其他

写了100多个shell脚本的老司机的翻车之旅

2017-07-26 徐洲更 生信媛

在写shell脚本上,我就算不是一名老司机,也算是一名合格司机了。

基本上,大部分重复的任务都被我写成了脚本,比如说下面这个脚本就是我用于重测序找variant用的脚本。

#!/bin/bash # version 1.1# function:  provide different function to align and vairant calling # author: xuzhougeng, xuzhougeng@163.com # parameter: samplePath, index, reference threads set -e set -u set -o pipefail PATH=/home/xzg/miniconda3/bin:/usr/local/bin:/usr/bin:/bin echo "you should run this program in the project root path "if [ $# -lt 4 ] then  echo -e "$# less than 4, please enter samplePath, index, reference and threads"  exit 1fi samplePath=$1index=$2suffix=$3threads=$4reference=${index} mkdir -p alignment alignDir=alignment # alignmentfor sample in `cat $samplePath` do    filename=${sample##*/}-${suffix}    echo "processing $filename with bwa"    if [ ! -f  $alignDir/${filename}.sam ]    then        bwa mem -t 8 -B 2 $index ${sample}_1.fq.gz ${sample}_2.fq.gz >\        $alignDir/${filename}.sam 2>  $alignDir/${filename}.log        echo "$filename done"    else        echo "$filename exists"    fi done # convert sort and index # warning total memoery > threads x memeoryfor sample in `cat $samplePath` do  echo "processing $filename with samtools"  output=${sample##*/}-${suffix}  samtools view -@ $threads -b -o $alignDir/${output}.bam $alignDir/${filename}.sam  samtools sort -@ $threads -m 1G -o $alignDir/${output}.sorted.bam $alignDir/${output}.bam  samtools index -@ $threads $alignDir/${output}.sorted.bam  echo "$filename done"done # vairant calling with bcftools mkdir -p variant_bcftools varDir=variant_bcftoolsfor sample in `cat $samplePath` do  output=${sample##*/}-${suffix}  echo "processing $sample with bcftools"  samtools mpileup  -vu -t AD,DP -f $reference $alignDir/${output}.sorted.bam | \  bcftools call -vm -Ov > $varDir/${output%%.*}_raw_variants.vcf && echo "$sample done " & done

但是今天我遇到了一个非常灵异的现象。


我和往常一样,用在我的ATOM文本编辑器中新建了一个配置文件,提供另一个脚本所需要的参数

# test.cfg dir=/mnt/f/Data/test/Data/Seq hawkDir=/home/xzg/biosoft/hawk jellyfishDir=/home/xzg/biosoft/jellyfish-Hawk/bin sortDir=/home/xzg/biosoft/coreutils/bin CORES=2KMERSIZE=31

而在另一个脚本,我用awk提取cfg里面的参数,然后遍历里面的文件夹的内容

#!/bin/bash set -e set -u set -o pipefail #modified from NIKS script #echo $PATH ... config=$1if [ ! -f ${config} ] && [ ! -r ${config} ] then    echo -e "$1 is not a file or is not readable \n "fi #  setting dirs=$(awk 'BEGIN{FS="="}; $1~/dir/ { print $2}' $config) hawkDir=$(awk 'BEGIN{FS="="}; $1~/hawkDir/ { print $2}' $config) jellyfishDir=$(awk 'BEGIN{FS="="}; $1~/jellyfishDir/ { print $2}' $config) sortDir=$(awk 'BEGIN{FS="="}; $1~/sortDir/ { print $2}' $config) CORES=$(awk 'BEGIN{FS="="}; $1~/CORES/ { print $2}' $config) KMERSIZE=$(awk 'BEGIN{FS="="}; $1~/KMERSIZE/ { print $2}' $config)for dir in ${dirs} do    cd $dir    OUTPREFIX=$(basename ${dir})      mkdir -p ${OUTPREFIX}_kmers ...

然后当我运行的时候, 提示我不存在文件夹!

我觉得这不可能呀,应该有这个文件夹呀,我用ls验证了一下

你看吧,的却是有这个文件的,你居然不认识,这简直不可思议。

于是我决定自己定义文件夹的路径了,然而依旧报错了!

for dir in ${dirs} do    dir=/mnt/f/Data/test/Seq/EF    OUTPREFIX=$(basename ${dir})      mkdir -p ${OUTPREFIX}_kmers ...

这很不科学,于是我放弃了进入文件路径的想法, 决定直接新建文件得了,于是改了一下代码

for dir in ${dirs} do    OUTPREFIX=$(basename ${dir})      mkdir -p ${OUTPREFIX}_kmers

还是出错了。但是我发现一个非常奇怪的符号 \r, 我的文件夹没有这个部分呀。

突然间,我好像知道了些什么!

真相就是我这个文件是在Windows下建立的,他的换行符是\M$, 而不是$

知道真相的我的眼泪流下来!我的半个小时活活就被这个换行符给消耗没了!你要知道看起来我写起来没几行内容,但是折腾的过程是多么心塞,你知道吗


所以

Windows和Linux交互的时候一定要注意换行符!!!
Windows和Linux交互的时候一定要注意换行符!!!
Windows和Linux交互的时候一定要注意换行符!!!

不说,我要回去静静


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存