2014-01-27 4 views
0

Я написал скрипт для печати книги:Логическое ИЛИ ошибка в сценарии оболочки Linux

#!/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 > 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 

Когда я сохранил этот код в файл «печать книги» и побежал это нравится:

print-book test.pdf gray 

Я получил это:

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 

т.е. условие "$ первый -o $ в прошлом" было правдой. Но если в этом месте отмечать «$ first» и «$ last» отдельно, они оба являются ложными.

Как это возможно?

ответ

3

Если $first и $last пустые, [ $first -o $last ] будут оценены как [ -o ], который не то, что вы хотите.

Вы должны использовать [ "$first" -o "$last" ], что эквивалентно [ "" -o "" ].


Никогда не используйте переменные, не цитируя их (если вы не знаете, что вы делаете): результаты будут неожиданными большую часть времени.

Кроме того, в командной строке проверьте интерактивное поведение в командной строке: просто введите [ $a -o $b ] && echo y, чтобы быстро увидеть, что происходит, и быть в состоянии играть с вашими переменными.

+1

Стандарт POSIX рекомендует использовать '-o' именно по этой причине и предлагает использовать' [...] || [...] 'вместо' [... -o ...] '. – chepner

Смежные вопросы