for
파일 루프 를 실행하려고하는데 전체 줄을 표시하고 싶습니다. 그러나 대신 마지막 단어 만 표시합니다. 나는 완전한 선을 원한다.
for j in `cat ./file_wget_med`
do
echo $j
done
실행 후 결과 :
Found.
내 데이터는 다음과 같습니다.
$ cat file_wget_med
2013-09-11 14:27:03 ERROR 404: Not Found.
for
파일 루프 를 실행하려고하는데 전체 줄을 표시하고 싶습니다. 그러나 대신 마지막 단어 만 표시합니다. 나는 완전한 선을 원한다.
for j in `cat ./file_wget_med`
do
echo $j
done
실행 후 결과 :
Found.
내 데이터는 다음과 같습니다.
$ cat file_wget_med
2013-09-11 14:27:03 ERROR 404: Not Found.
답변:
for
공백, 탭 또는 줄 바꿈과 같은 공백이 있으면 루프가 분할됩니다. 따라서 IFS (Internal Field Separator) 를 사용해야합니다 .
IFS=$'\n' # make newlines the only separator
for j in $(cat ./file_wget_med)
do
echo "$j"
done
# Note: IFS needs to be reset to default!
unset IFS
나중에 다른 명령이 동일한 쉘에서 영향을받지 않도록 나중에 권장됩니다 .
$
뜻 IFS=$'\n'
인가요?
$
줄 바꿈이 문자열 내에서 작동하도록합니다. local IFS=$'\n'
함수 내부 에서도 수행해야 합니다.
$'...'
" ANSI-C Quoting "
for
루프는 기본적으로 공백 (공백, 탭, 개행)에서 분리됩니다. 한 번에 한 줄씩 작업하는 가장 쉬운 방법 은 while read
대신 줄 바꿈 을 사용하여 루프 를 사용하는 것입니다.
while read i; do echo "$i"; done < ./file_wget_med
나는 당신의 명령이 한 줄에 한 단어를 뱉어 내기를 기대 합니다 (내 파일로 테스트 할 때 일어난 일입니다). 다른 일이 발생하면 그 원인이 무엇인지 잘 모르겠습니다.
for i in `ls`; do echo $1; done
while 명령으로 출력을 파이프하여 다음을 수행 할 수도 ls|while read i; do echo $i; done
있습니다. 이것은 환경 변수를 변경할 필요없이 공백이있는 파일 / 폴더 이름에서 작동합니다. 아주 좋은 대답입니다.
ls
와 함께 사용하기에 안전하지 않은 것으로 간주됩니다 |
. find
이 목적을 위해 더 안전하고 유연합니다.
pbpaste | while read t; do echo "<string>$t</string>"; done
ls -1
함께 사용할 수 있습니다 |
한 당 라인 포맷되지 않은 출력을 보장하기 위해
#!/bin/bash
files=`find <subdir> -name '*'`
while read -r fname; do
echo $fname
done <<< "$files"
검증 된 작업, 원하는 라이너는 아니지만 우아하게 작업 할 수는 없습니다.
나는 이것을 다음과 같이 쓸 것이다.
cat ./file_wget_med | while read -r j
do
echo $j
done
원본 스크립트에서 최소한의 변경이 필요하기 때문에 (를 사용하는 솔루션은 제외 IFS
하지만 bash
이 루프 제어문의 동작 을 수정 하지는 않습니다).
cat
는 불필요합니다. while
루프는 리디렉션을 잘 받아들입니다. 이것이 보통 다음과 같이 쓰여집니다.while IFS= read -r line; do...done < input.txt
맵 파일은 로하지 휴대용 인덱스 배열로 파일에서 라인을 읽을 수있는 편리한 방법입니다 읽을 수 있지만 약간 빠른. for 루프를 사용하면 서브 쉘 작성을 피할 수 있습니다.
#!/bin/bash
mapfile -t < file.txt
for line in "${MAPFILE[@]}"; do
echo $line
done
파이프 라인을 사용할 때 while 루프를 서브 쉘에 넣습니다. while 루프 형 변수 내부의 변경 사항은 스크립트의 외부 부분으로 전파되지 않습니다.
예:
#!/bin/bash
a=0
printf %s\\n {0..5} | while read; do
((a++))
done
echo $a # 'a' will always be 0.
(더 나은 해결책) :
#!/bin/bash
b=0
while read; do
((b++))
done < <(printf %s\\n {0..5})
echo $b # 'b' equal to 6 (works as expected).
Dandalf는 함수형 솔루션에 가까워졌지만 알 수없는 양의 입력 결과 find ~/.gdfuse -name '*'
를 변수 에 할당하려고 시도해서는 안됩니다 ! 또는 적어도 배열 변수를 통해 그러한 일을 시도하십시오. 당신이 너무 게으르다 고 주장한다면! 여기 Dandalf의 솔루션은 위험한 조작없이 수행됩니다. 그리고 한 줄로
while read -r fname; do
echo $fname;
done <<< `find ~/.gdfuse -name '*'