변수 값 자르기

변수 값 자르기

나는 파일의 URL 문자열 목록을 변수로 읽고 향후 처리를 위해 준비하는 간단한 스크립트를 작성했습니다.

dl.txt 파일의 내용:

https://some-url.com/site1
https://some-url.com/site2

and so on...

스크립트:

#!/bin/bash

IFS="\n"

while read -a line; do
    rl=.${line}

    echo -e "\n"
    echo $rl
    echo -e "\n"

#   for a in ${line}; do
#       echo -e $a
#   done
done <<< $(cat "./dl.txt")

결과적으로, 읽은 문자열의 각 문자는 처음부터 정확히 10자로 잘립니다.

문제를 해결하는 방법을 아시나요?

답변1

IFS="\n"

이는 백슬래시(backslash)와 (소문자 N) IFS두 문자로 설정됩니다. 이는 나중에 그 중 하나에 대한 입력이 분할된다는 것을 의미합니다. 이제 예제에서 이 있는 유일한 줄은 이지만 결과를 보기에는 충분합니다.\nreadnand so on...

당신은 사용하고 싶을 수도 있습니다

IFS=$'\n'

그러나 주석에서 올바르게 지적했듯이 이것은 read개행 문자로 끝나는 한 줄만 읽은 다음 개행 문자를 구분 기호로 사용하여 여러 필드로 분할하려고 시도하기 때문에 의미가 없습니다. 다음 단계는 작동하지 않습니다.

입력 파일의 행을 반복하려면 다음을 사용하십시오.

while IFS= read -r line; do ...

또는 배열로 읽어서 반복하려는 경우:

mapfile -t lines < ...
for line in "${lines[@]}"; do ...

하지만 보세요쉘 루프를 사용하여 텍스트를 처리하는 것이 왜 나쁜 습관으로 간주됩니까?


또한 이것은 약간 수상합니다.

 done <<< $(cat "./dl.txt")

일반적으로 따옴표 없이 확장하면 출력이 cat단어로 분할되지만 오른쪽에서는 단어 분할이 발생하지 않는 것 같습니다 <<<. 하지만 이는 a("모호한 리디렉션"으로 인해 오류가 발생할 수 있음) 오른쪽에서 발생하므로 <따옴표로 묶는 것이 좋습니다.

아니면 그냥 프로세스 대체를 사용하세요.

... < <(cat "./dl.txt")

아니면 그냥 고양이를 버리세요:

... < dl.txt

답변2

배쉬의 경우:

while read line; do
        array+=(${line:10})
done < dl.txt
echo ${array[@]}

관련 정보