다음 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
두 가지 질문이 있습니다:
- ~처럼스틸 드라이버가 지적한다., 쉘에서의 할당(C 쉘 파생 클래스 제외)은 다음과 같습니다.
바꾸다=값
아니요$바꾸다=값
- 여기 문서의 구분자 문자열을 인용하지 않으면 여기 문서의 내용이 해석(확장)됩니다. 그러므로 볼 것을 기대해서는 안 되고
DAStrim=$(DASqv -v -H6973 ...)
, 볼 것을 기대해야 합니다. 어떤 이유로든 명령을 보려면 , 또는 해당 문자를 인용하거나(, , 또는 기타 다양한 변형을 사용할 수 있도록) 이스케이프해야 합니다. 예를 들어,DAStrim=whatever_the_output_of_DASqv_is
EOF
'EOF'
"EOF"
\EOF
$
$ 작업 디렉토리=/tmp $ i=foobar.las $cat<< EOF cd \$WORKDIR ls -l "$i" 오늘=$(날짜) EOF CD $WORKDIR (산출) ls -l "foobar.las" 오늘 = 2018년 1월 30일 화요일 오전 1시 27분 42초 $cat<< 'EOF' cd \$WORKDIR (위 입력과 동일) ls -l "$i" 오늘=$(날짜) EOF cd \$WORKDIR (산출) ls -l "$i" 오늘=$(날짜) $