tt 파일에서 목록을 읽고 이를 변수로 사용하여 foo 루프에서 Python 스크립트를 실행하는 쉘 스크립트

tt 파일에서 목록을 읽고 이를 변수로 사용하여 foo 루프에서 Python 스크립트를 실행하는 쉘 스크립트

txt 파일에서 변수를 읽고 for 루프에서 해당 변수를 사용하여 Python 파일을 실행하는 쉘 스크립트를 실행하려고 합니다.

  1. 이 코드는 var1, var2, var3....var 100과 같은 최소 100개의 변수가 있는 txt 파일을 읽습니다.

  2. 이 코드는 디렉터리(Rep1, Rep2)를 변경하여 각 디렉터리 RepOut_Rep1.out에서 다른 파일을 읽습니다.

  3. 이 코드는 Python 코드를 실행하여 다른 디렉토리에서 항목을 가져옵니다.

    python /home/PhytonFiles/phytonFold.py  -s /home/mySFiles/$var -o $RepOut_Rep1.out -n summaryFile.txt
    

다음 코드를 작성했지만 작동하지 않는 것 같습니다.

input="MyList.txt"
while IFS= read -r file; 
do
# printf '%s\n' "$file"
  
# run the script for the following directories (Rep1, Rep2. ...)
  for f in Rep1 Rep2
  do
  cd ${f}

#  pull the output file 
  outFile=RepOut_${f}.out

# create a summary folder at the end of the run
  summaryFile=summary_${f}_$file

# run the python file, get the inputs from /home/mySFiles/ with the variable $file
  phyton /home/PhytonFiles/phytonFile.py  -s /home/mySFiles/$file -o $outFile -n $summaryFile 

done 
done < "$input"

Python 실행 라인에서 사용하는 변수가 올바른지 잘 모르겠습니다. 내가 어디로 잘못 갈 수 있니?

당신의 도움을 주셔서 감사합니다.

비르칸

답변1

실제로 당신이 원하는 일을 하는 것을 방해하는 뭔가가 있습니다.

  1. 게다가 9행에서 Rep1로 cd한 다음 for 루프가 계속되면 여전히 Rep1에 있기 때문에 Rep2로 cd할 수 없습니다.

따라서 폴더 구조가

./
  ./Rep1
  ./Rep2

Python 스크립트를 실행한 후 상위 폴더로 다시 이동해야 합니다. 하지만 솔직히 말해서 cd 명령을 사용해야 하는 이유를 모르겠습니다. for 루프에 전체 파일 경로를 작성하면 됩니다.

  1. 또한 Python 철자를 잘못 입력했으므로 Python 줄이 실행되지 않았을 수도 있습니다.

  2. 다음과 같은 변수 파일을 의미하는 경우:

VAR1=a VAR2=b VAR3=c ...

그런 다음 파일을 읽는 것보다 파일을 가져오고 싶지만 스크립트를 기반으로 파일이 실제로 bash 변수의 변수 파일이 아니라 파일 이름 폴더인 것으로 추측합니다.

file1.txt
file2.txt
file3.txt
...

이 경우 파일 이름에 공백이 있는지 알 수 없으므로 항상 $file을 따옴표로 묶어야 하며 공백이 있으면 bash는 Python 줄에 다음과 같은 내용을 인쇄합니다.

phyton /home/PhytonFiles/phytonFile.py  -s /home/mySFiles/some file name.txt -o $outFile -n $summaryFile 

이렇게 하면 Python이 다음 옵션을 사용할 수 있다고 생각하게 됩니다.

-s /home/mySFiles/some
-o $outFile
-n $summaryFile

그리고 이러한 주장은

file
name.txt

방금 설명한 변경 사항이 포함된 스크립트 버전은 다음과 같습니다. :)

#!/bin/bash

input="MyList.txt"
while IFS= read -r file;
do
# printf '%s\n' "$file"

  # run the script for the following directories (Rep1, Rep2. ...)
  for f in Rep1 Rep2
  do

  # pull the output file
  outFile="RepOut_${f}.out"
  printf "\noutFile:\t%s\n" "$outFile"

  # create a summary folder at the end of the run
  summaryFile="summary_${f}_$file"
  printf "summaryFile:\t%s\n" "$summaryFile"

  # run the python file, get the inputs from /home/mySFiles/ with the variable $file
  echo python /home/PhytonFiles/phytonFile.py  -s "/home/mySFiles/$file" -o "$outFile" -n "$summaryFile"
  done
done < "$input"

또한 이런 종류의 문제에 대한 좋은 팁이 있는데, Python 줄 앞에 "echo"라는 단어를 넣는 것입니다. 그대로 실행하면 라인의 각 반복이 어떤 모습일지 미리 볼 수 있습니다.

맞다고 생각되면 처음부터 "echo"를 제거하고 다시 실행하면 실제로 코드가 실행됩니다.

행운을 빌어요.

관련 정보