我有以下 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
有两个问题:
- 作为钢铁司机指出,shell 中的赋值(C shell 派生类除外)看起来像
多变的=价值
不是$多变的=价值
- 如果此处文档的分隔符字符串未加引号,则会解释(扩展)此处文档的内容。所以你不应该期待看到
DAStrim=$(DASqv -v -H6973 ...)
,你应该期待看到。如果出于某种原因,您想要查看该命令,您应该引用、 或其任何字符(这样您就可以使用、、或各种其他变体),或者转义。例如,DAStrim=whatever_the_output_of_DASqv_is
EOF
'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" 今天=$(日期) $