2016-07-06 11 views
1

쉘 스크립트에서 명령 대체에 약간의 문제가 있습니다. 전에이 스크립트를 다른 시스템에서 사용 했으므로 여기에서 무슨 일이 일어나는지 확실하지 않습니다. 변수를 설정하기 위해 명령을 묶는 것과 상관없는 것처럼 보입니다. 빈 변수가 생깁니다. 나는 그들을 묶는 많은 다른 방법을 시도했다. ($(), backticks, 따옴표). 도움이된다면 배열 작업을 제출하려고합니다.명령 대체 문제 (변수가 비어 있음)

#!/bin/bash 
#BSUB -q shared 
#BSUB -W 23:55 
#BSUB -M 51200 
#BSUB -J windowCovR1 
#BSUB -R "span[hosts=1]" 

mem=$LSB_JOBINDEX 
sample=`head -n "$mem" bednames.txt | tail -1 | awk '{print $2}'` 
eval ${sample} 
echo ${sample} 

$mem가 제대로 설정되고, 그것은 sample 라인 뭔가. echo 명령은 빈 줄을 인쇄합니다.

+0

[변수에 명령을 넣으려고하는데 복잡한 경우가 항상 실패합니다!] (http://mywiki.wooledge.org/BashFAQ/050) – fedorqui

+0

나는이 문제를 실제로 해결했다고 생각하지 않습니다. ... 이것은 (다른 시스템에서) 나를 위해 이전에 작동 했으므로 지금 무슨 일이 일어나고 있는지 확신 할 수 없습니다. – Ethan

+0

아마도'bednames.txt'는 비어 있습니까? 파일에서 줄'N '을 얻는 더 좋은 방법은'sample = $ (awk -vlineno = $ {mem}'NR == lineno {print $ 2} 'bednames.txt)'... – twalberg

답변

0

왜 다른 인용 부호 대신 임의로 "역 인용 부호를 사용 하시겠습니까?" 역습을 어떻게하는지 알고 있습니까?

대체 결과가 비어 있으면 변수 값이기 때문입니다. 당신은 출력을 변수로 설정하는 명령을 디버깅 해 보았습니까? 오, 모르겠는데 아마도 터미널에서 타이핑 할 것입니다.

-1

샘플 값을 지정하는 명령이 정확합니다. 커맨드 라인에서 저와 함께 일합니다. 그러나 쉘 스크립트에서 같은 것을 사용하고 있습니다. 그래서위한 아래에서 사용해보십시오 : -

샘플 = head -n "$mem" bednames.txt | tail -1 | awk '{print \$2}'

\ $ 2 전에. \를 사용하지 않을 때 스크립트는 두 번째 명령 줄 인수를 확인합니다.

+0

작은 따옴표 안에 '$'를 이스케이프 할 필요가 없기 때문에 'awk'이 구문 오류에 대해 불평 할 수 있습니다. – twalberg

0

$LSB_JOBINDEX을 사용하고 있으므로 배열 작업이 필요할 수 있습니다. 작업 이름에는 배열의 시작 및 끝 매개 변수가 포함되어야합니다. 예 :

#BSUB -J windowCovR1[1-100] 

파일 bednames.txt에 100 개의 명령 줄이 있다고 가정합니다. 배열 범위가 없으면 $LSB_JOBINDEX은 항상 0입니다. head -n 0은 빈 문자열을 제공합니다.

이 간단한 예제를 시도했는데 나에게 잘 돌아갔다.

[[email protected] ~]$ cat tmp.sh 
#!/bin/bash 
#BSUB -q normal 
#BSUB -W 23:55 
#BSUB -M 10 
#BSUB -J windowCovR1[1-2] 
#BSUB -R "span[hosts=1]" 

mem=$LSB_JOBINDEX 
echo "$$ mem $mem" >> /tmp/LOG 
sample=`head -n "$mem" bednames.txt | tail -1 | awk '{print $2}'` 
echo "$$ ${sample}" >> /tmp/LOG 

[[email protected] ~]$ cat bednames.txt 
line11 line12 
line21 line22 

[[email protected] ~]$ bsub < tmp.sh 
Job <805> is submitted to queue <normal>. 

[[email protected] ~]$ cat /tmp/LOG 
7979 mem 1 
7979 line12 
7991 mem 2 
7991 line22 

또 다른 작은 점. 이것이 병렬 작업이 아니면 -R "span[hosts=1]"은 필요하지 않습니다.