Quoting Trouble? Think, Then Use echo

Q: I can't get the following shell script to work:

case $col2 in "income") awk '{if($2=="$col2") {
 /* THIS LINE IS THE PROBLEM */ /* I CAN'T GET AWK TO RECOGNIZE EITHER '$col2' or '$2' */ . .
}
' $file1 ;;

A: It is clear from this code fragment that awk is supposed to compare $2 with "income". If you think about it (or change awk to echo above), you will see that you have given the following to awk:

{if($2==income) {
 /* THIS LINE IS THE PROBLEM */

A: What does awk do with this? It compares $2 with the contents of the variable income. If income has not been set, it compares it with zero or with the null string. Instead, you want:

{ if ($2 == "income") {

A: which you can say with:

case $col2 in income) awk ' {
 if ($2 == "'$col2'") {
 ... awk code ...
}
}' $file1;;

Replacing commands with echo in shell scripts is a handy debugging trick.

- CT in net.unix on Usenet, 1 November 1986