title: Logical OR error in Linux shell script
body: <p>I have written a shell script for printing book:</p>
  
  <pre><code>#!/bin/sh
  if [ -z "$1" ]
  then
      exit 1
  fi
  filename=$1
  options=""
  mode="color"
  first=""
  last=""
  pages="All pages from"
  shift
  until [ -z "$1" ]
  do
      if [ $1 = "gray" -o $1 = "grey" -o $1 = "grayscale" -o $1 = "greyscale" ]
      then
          options=" -o ColorModel=KGray"
          mode=$1
      elif [ $1 = "from" ]
      then
          shift
          first="$1"
      elif [ $1 = "to" ]
      then
          shift
          last="$1"
      fi
      shift
  done
  if [ $first -o $last ]
  then
      pages="Pages"
      if [ $first ]
      then
          pages="$pages $first"
          first=" -f $first"
      else
          pages="$pages 1"
      fi
      if [ $last ]
      then
          pages="$pages to $last"
          last=" -l $last"
      else
          pages="$pages to last"
      fi
      pages="$pages from"
  fi
  echo -n "$pages $filename will be printed in $mode mode. If it's OK, put paper in your printer and press ENTER. Else press CTRL+C. "
  read ack
  pdftops$first$last -expand $filename - | psbook | psnup -2 &gt; tmp.ps
  psselect -o tmp.ps | lpr$options
  echo -n "Wait for the end of printing, then take printed pages, put them back in printer to print on other side and press ENTER again."
  read ack
  psselect -e -r tmp.ps | lpr$options
  rm tmp.ps
  exit 0
  </code></pre>
  
  <p>When I saved this code to file "print-book" and ran it like:</p>
  
  <pre><code>print-book test.pdf gray
  </code></pre>
  
  <p>I got this:</p>
  
  <pre><code>Pages 1 to last from test.pdf will be printed in gray mode. If it's OK, put paper in your printer and press ENTER. Else press CTRL+C
  </code></pre>
  
  <p>i.e. condition "$first -o $last" was true. But if check "$first" and "$last" separately in this place, they both are false.</p>
  
  <p>How is this possible?</p>