Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!husc6!rice!uw-beaver!uw-june!ka From: ka@june.cs.washington.edu (Kenneth Almquist) Newsgroups: comp.unix.questions Subject: Re: Help with strings in Bourne shell Message-ID: <8049@june.cs.washington.edu> Date: 29 Apr 89 20:02:33 GMT References: <10166@orstcs.CS.ORST.EDU> Distribution: usa Organization: U of Washington, Computer Science, Seattle Lines: 51 rudolf@oce.orst.edu (Jim Rudolf) writes: > If I have a Bourne script called 'foo' and I call it with the arguments: > foo "color = red" "size = big" > then from within foo they will be read as: > $1 = "color = red" > $2 = "size = big" > However, I want to read from stdin (or maybe a redirected pipe), and I > can't get it to work no matter what strange combination of quotes I use! > I would like to do something like: > read args > for i in $args > . > . > so I can process each string in turn. Why can't I get this to work? > Do command line arguments get treated differently than arguments read > from within the script? Any suggestions would be greatly appreciated. Presumably you want to read in a single line with multiple quoted strings in it. The read command doesn't handle quoted strings. (The shell manual page lies.) One possible solution is to use the eval command: read line || exit 0 # exit if end of file eval "set $line" # parse line for i in "$@" ... Let's work through an example. Assume that the input line is "color = red" "size = big" Then the read command will store the line in the variable "line". The second command will run the eval command with a single argument, the string set "color = red" "size = big" The set command assigns its arguments to the positional parameters, so you will get $1 = "color = red" $2 = "size = big" The for loop will then step through the positional parameters. Several warnings about this. First, if the first argument to set begins with a minus or plus sign, it will be interpreted as an option. Second, this won't work if the number of arguments to set is zero. Third, the set command changes the positional parameters, making the original arguments to the shell procedure inaccessible. And fourth, if the argument to "set" is not syntactically correct, the shell procedure will terminate. Kenneth Almquist