![파일의 각 줄을 다른 변수에 저장하고 명령줄 입력 및 출력에서 각 변수를 하나씩 사용합니다.](https://linux55.com/image/157762/%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EA%B0%81%20%EC%A4%84%EC%9D%84%20%EB%8B%A4%EB%A5%B8%20%EB%B3%80%EC%88%98%EC%97%90%20%EC%A0%80%EC%9E%A5%ED%95%98%EA%B3%A0%20%EB%AA%85%EB%A0%B9%EC%A4%84%20%EC%9E%85%EB%A0%A5%20%EB%B0%8F%20%EC%B6%9C%EB%A0%A5%EC%97%90%EC%84%9C%20%E2%80%8B%E2%80%8B%EA%B0%81%20%EB%B3%80%EC%88%98%EB%A5%BC%20%ED%95%98%EB%82%98%EC%94%A9%20%EC%82%AC%EC%9A%A9%ED%95%A9%EB%8B%88%EB%8B%A4..png)
저는 쉘 스크립팅을 처음 접했기 때문에 이전에 이 질문을 받은 적이 있다면 사과드립니다.
다음과 같은coordinates.txt 파일이 있습니다.
765442
866447
755343
097754
파일의 각 줄의 각 값을 변수에 전달하고 해당 값을 명령줄의 입력으로 하나씩 사용하고 해당 숫자를 파일 이름의 일부로 저장하고 싶습니다. 다음 코드를 작성했지만 이것이 올바른 방법인지 확실하지 않습니다 ...
cat coordinates.txt | while read LINE; do
var="$(echo $LINE)"
/home/users/scripts/TreeView/TreeView.sh -o $NAME_ALL.chr1.new_estimate.trees.$var --bp_of_interest $var
done
따라서 출력 -o에서 각 값은 한 번에 하나씩 파일 이름에 추가되고 각 값은 한 번에 하나씩 --bp_of_interest로도 사용됩니다.
어떤 제안이라도 높이 평가하겠습니다. 감사해요
답변1
귀하의 루프는 다음과 같이 작성하는 것이 가장 좋습니다.
PATH=/home/users/scripts/TreeView:$PATH
while IFS= read -r line; do
TreeView.sh -o "$name_all.chr1.new_estimate.trees.$line" --bp_of_interest "$line"
done <coordinates.txt
이로 인해 다음이 변경됩니다.
/home/users/scripts/TreeView
앞쪽 에 추가했어요$PATH
. 이를 통해TreeView.sh
절대 경로를 추가하지 않고도 호출을 할 수 있습니다 .var
입력 파일에서 읽은 값과 동일한 값이므로 변수를 제거했습니다 .- 내가 사용하는
IFS= read -r line
이유는 ""IFS=read-r-line" 이해". - 저는 "라는 이유로 변수 이름을 소문자로 사용합니다.쉘 스크립트의 변수에 대한 명명 규칙이 있습니까?".
cat
이 경우에는 필요하지 않기 때문에 리디렉션을 통해 파일의 데이터를 루프에 전달합니다 .
동일한 작업을 수행하는 또 다른 방법:
PATH=/home/users/scripts/TreeView:$PATH
xargs -I {} TreeView.sh -o "$name_all.chr1.new_estimate.trees.{}" --bp_of_interest "{}" <coordinates.txt
xargs
각 행에서 읽은 데이터를 가 나타내는 위치의 coordinates.txt
스크립트 매개변수에 삽입하는 데 사용됩니다 .TreeView.sh
{}
명령줄(예: before , 숫자는 어디에 있음) -P n
에 추가하여 스크립트의 여러 병렬 인스턴스를 한 번에 실행할 수도 있으며 , 각 인스턴스는 해당 명령줄에 적절한 데이터를 삽입합니다 .xargs
-I {}
n
coordinates.txt