How to read complete line in 'for' loop with spaces
I am trying to run a for
loop for file and I want to display whole line.
But instead its displaying last word only. I want the complete line.
for j in `cat ./file_wget_med`
do
echo $j
done
result after run:
Found.
Here is my data:
$ cat file_wget_med
2013-09-11 14:27:03 ERROR 404: Not Found.
for
loop splits when it sees any whitespace like space, tab, or newline. So, you should use 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!
for
loops split on any whitespace (space, tab, newline) by default; the easiest way to work on one line at a time is to use a while read
loop instead, which splits on newlines:
while read i; do echo "$i"; done < ./file_wget_med
I would expect your command to spit out one word per line (that's what happened when I tested it out with a file of my own). If something else is happening, I'm not sure what could be causing it.
#!/bin/bash
files=`find <subdir> -name '*'`
while read -r fname; do
echo $fname
done <<< "$files"
Verified working, not the one liner you probably want but it's not possible to do so elegantly.
Here is a slight extension to Mitchell Currie's answer, that I like because of the small scope of side effects, which avoids having to set a variable:
#!/bin/bash
while read -r fname; do
echo $fname
done <<< "`find <subdir>`"