3

i'm reading a few variables from a file using

while read a b c; do
  (something)
done < filename

is there an elegant way to skip a variable (read in an empty value), i.e. if I want a=1 b= c=3, what should I write in the file?

Right now i'm putting

1 "" 3

and then use

b=$(echo $b | tr -d \" )

but this is pretty cumbersome, IMHO

any ideas?

2 Answers 2

3

With a blank field:

1 3

You can do:

if [[ -z c ]]
then
    c=b
    b=
fi

If your data is comma delimited, you can also do:

while IFS=, read a b c

(but you'll have problems if your fields contain commas, as you may in your current version if they contain quotes):

1,,3

Also, in your version instead of using tr, you can do:

b=${b//\"\"}

but you can eliminate that step altogether using the following with your current data format:

while IFS='"' read a b c

however, comma-delimited fields is a more common format.

2
  • this would work only if there is only one optional variable, but I have more than one, unfortunately. But +1 for getting rid of tr in any case ;) Mar 26, 2010 at 8:23
  • @Aleksandar: The comma-delimited version would work for any number of fields. 1,,3,4,5,,7 Mar 26, 2010 at 9:49
0

I am not sure if I understood what you want but you can skip certain values of the iteration (be it while, for or whatever) with continue and even stop the iteration with break

while read a b c ;do 
   if [[ $b == 0 || $c == 0 || $a == 0 ]];then
      continue
   fi      
   (makelovenotwar)
done < /foo/bar
1
  • No, by "skipping" I meant putting an empty value into a variable Mar 26, 2010 at 8:20

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.