나는 파일의 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
두 문자로 설정됩니다. 이는 나중에 그 중 하나에 대한 입력이 분할된다는 것을 의미합니다. 이제 예제에서 이 있는 유일한 줄은 이지만 결과를 보기에는 충분합니다.\
n
read
n
and 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[@]}