I need a better way to loop in the shell...
Norberto Meijome
freebsd at meijome.net
Tue Dec 13 21:31:33 PST 2005
user wrote:
> I always do loops in /bin/sh like this:
>
> for f in `cat file` ; do rm -rf $f ; done
>
> Easy. I like doing it like this.
>
> The problem is, when I am dealing with an input list that has multiple
> words per line, this chops it up and treats every word as a new line...
>
> For instance, lets say I have a file full of filenames, like this:
>
> # cat file
>
> 10,000 Maniacs MTV Unplugged - 01 - These Are Days.mp3
> 10,000 Maniacs MTV Unplugged - 02 - Eat For Two.mp3
> 10,000 Maniacs MTV Unplugged - 03 - Candy Everybody Wants.mp3
>
> and I try to use the above loop on it, it thinks that every word is a line
> ... the above loop will attempt to delete the following files:
>
> 10,000
> Maniacs
> MTV
> Unplugged
> -
> 01
> -
> These
>
> (and so on)
>
> Even if I quote the variable $f, like:
>
> for f in `cat file` ; do rm -rf "$f" ; done
>
> it still does the same thing.
>
> -----
>
> So my question is, what is a nice simple way to loop in the shell, as
> close to what I am doing above as possible, that does not have this
> problem ? Should I just be using something other than `cat` ? Or what ?
you can redefine the character(s) used by your shell for delimiting
words after expansion. In Bash , this is the env var IFS. so , if you
know there are no ;, you can say
export IFS=";"
[your loop here]
export IFS=
and you should be set.
man bash for more info.
Beto
More information about the freebsd-questions
mailing list