여러 줄이 포함된 텍스트 파일이 있습니다. 파일을 한 줄씩 읽으려면 while 명령을 사용하는데, 별도의 변수에 값을 저장하고 후행 쉘 스크립트에서 사용해야 합니다.
이것자르다이 명령은 읽은 줄이 아닌 전체 파일을 구분합니다.
예 my_file.txt
:
d1:jobid1
id2:jobid2
아래 while 루프를 사용하여 파일을 한 줄씩 읽고 있습니다.
while IFS= read -r line; do
jobid=`cut -d: -f2`
id=`cut -d: -f1`
#remaining shell-script dependent upon variables#
done < my_file.txt
my_file.txt
각 행의 jobid와 id를 저장 하고 후행 스크립트를 실행하고 싶습니다 .각 줄은 새로운 줄입니다
변수에 값을 재귀적으로 저장하는 데 도움이 필요합니다. 한 줄씩 읽고 두 필드를 별도로 분리하여 저장하는 더 좋은 방법이 있다면.
답변1
cut
기본값은 표준 입력에서 읽는 것입니다. 명령 대체에서 표준 입력은 루프의 표준 입력에서 상속됩니다( 호출에 다른 명시적 입력을 제공하지 않기 때문 cut
). 루프의 표준 입력은 입력 파일에서 나옵니다.
결과적으로 파일의 첫 번째 줄을 읽고 read
첫 번째 호출에서 다른 모든 줄을 읽습니다 cut
. 따라서 변수의 값은 jobid
줄 바꿈으로 구분된 작업 ID 문자열이 되며 id
변수는 비어 있게 됩니다. 이 루프는 한 번의 반복 동안만 실행됩니다.
너사용할 수 있다, 예를 들어,
id=$( printf '%s\n' "$line" | cut -d: -f1 )
# or: id=$( cut -d: -f1 <<<"$line" )
# (in shells that supports "here-strings")
그러나 이것이 더 깨끗하고 효율적이기 때문에 필요하지 않습니다.
while IFS=: read -r id jobid; do
# code that uses "$id" and "$jobid" goes here
done <my_file.txt
read
이는 입력 데이터의 한 행을 동시에 여러 변수로 읽을 수 있다는 점을 활용합니다. 콜론으로 설정하면 IFS
행이 콜론에서 분할되어 첫 번째 필드를 읽고 id
나머지 필드를 에서 읽습니다 jobid
. cut
전혀 전화할 필요가 없습니다.