变量值填充在 bash 中不起作用

变量值填充在 bash 中不起作用

我有以下 bash 脚本:

#!/bin/bash
$db=DB
$H=6973
$cov=38
for i in $(find . -type f -name "*.*.las");
do
  cat <<EOF
  #qsub <<EOF
#!/bin/bash -l

#PBS -N DASqv
#PBS -l walltime=48:00:00
#PBS -j oe
#PBS -l mem=30G
#PBS -l ncpus=1
#PBS -M [email protected]
##PBS -m bea

cd \$PBS_O_WORKDIR

source activate thegenemyers

DAStrim=$(DASqv -v -H$H -c$cov $db $i | grep Recommend - | sed "s|Recommend ||g" - | sed "s|'||g" -)

DAStrim $db $i 

EOF

done

不幸的是,我收到了这个错误:

sh Dascrubber_pbs.sh

DASqv: -H '' argument is not an integer
  #qsub <<EOF
#!/bin/bash -l

#PBS -N DASqv
#PBS -l walltime=48:00:00
#PBS -j oe
#PBS -l mem=30G
#PBS -l ncpus=1
#PBS -M [email protected]
##PBS -m bea

cd $PBS_O_WORKDIR

source activate thegenemyers

DAStrim=

DAStrim  ./DB.309.las

我本来希望看到例如DAStrim=$(DASqv -v -H6973 -c38 DB ./DB.82.las | grep Recommend - | sed "s|Recommend ||g" - | sed "s|'||g" -)

我错过了什么?

答案1

有两个问题:

  1. 作为钢铁司机指出,shell 中的赋值(C shell 派生类除外)看起来像
    多变的=价值
    不是
    $多变的=价值
  2. 如果此处文档的分隔符字符串未加引号,则会解释(扩展)此处文档的内容。所以你不应该期待看到DAStrim=$(DASqv -v -H6973 ...),你应该期待看到。如果出于某种原因,您想要查看该命令,您应该引用、 或其任何字符(这样您就可以使用、、或各种其他变体),或者转义。例如,DAStrim=whatever_the_output_of_DASqv_isEOF'EOF'"EOF"\EOF$
    $ 工作目录=/tmp
     
    $ i=foobar.las
     
    $ 猫 << EOF
    cd \$WORKDIR
    ls -l "$i"
    今天=$(日期)
    EOF
    cd $WORKDIR                             (输出)
    ls -l“foobar.las”
    今天=2018 年 1 月 30 日星期二 1:27:42 AM
     
    $ 猫 << 'EOF'
    cd \$WORKDIR                            (与上面相同的输入)
    ls -l "$i"
    今天=$(日期)
    EOF
    cd \$WORKDIR                            (输出)
    ls -l "$i"
    今天=$(日期)
     
    $

相关内容