구분 기호를 사용하여 행을 분할하고 두 필드를 다른 변수에 저장합니다.

구분 기호를 사용하여 행을 분할하고 두 필드를 다른 변수에 저장합니다.

여러 줄이 포함된 텍스트 파일이 있습니다. 파일을 한 줄씩 읽으려면 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전혀 전화할 필요가 없습니다.

관련 정보