Кавычки в if

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
lazhu
сержант
Сообщения: 176
Зарегистрирован: 2013-08-10 14:28:38
Контактная информация:

Кавычки в if

Непрочитанное сообщение lazhu » 2014-10-31 19:58:52

Вопрос на засыпку.
Есть вот такой скриптик:

Код: Выделить всё

#!/bin/sh

SRC="/var/spool/altqueue"
DST="$SRC/ready"
cmd="sendmail -OQueueDirectory=$DST -C /etc/mail/sendmail_t.cf -q"
q="q*"

if [ -f "$DST/$q" ]; then
   $cmd; exit
elif [ ! -f "$SRC/$q" ]; then
   exit
fi

cd $SRC

c=0
for i in $q; do
   if [ $c -eq 5 ]; then
      break
   fi
   f=`echo $i | tail -c+2`
   mv $i d$f $DST
   c=`expr $c + 1`
done

sleep 1
$cmd

Долгое время он вполне себе нормально отрабатывал, но в какой-то момент вдруг перестал копировать файлы из $SRC в $DST, несмотря на их наличие в первой.
Вылечилось убиранием кавычек отсюда:

Код: Выделить всё

if [ -f $DST/$q ]; then
   $cmd; exit
elif [ ! -f $SRC/$q ]; then
   exit
fi


Система:

Код: Выделить всё

uname -a
FreeBSD router.apnet.local 8.3-RELEASE FreeBSD 8.3-RELEASE #0: Fri Jan  4 17:11:04 MSK 2013     root@router.apdom.local:/usr/obj/usr/src/sys/FIREWALL  amd64

/bin/sh остался прежним:

Код: Выделить всё

ls -l /bin/sh 
-r-xr-xr-x  1 root  wheel  137504 Apr 10  2012 /bin/sh

Может кто-то объяснить уличную магию?

Аватара пользователя
skeletor
майор
Сообщения: 2372
Зарегистрирован: 2007-11-16 18:22:04
Откуда: Kiev
Контактная информация:

Re: Кавычки в if

Непрочитанное сообщение skeletor » 2014-11-03 11:03:02

1) Дебажить bash-скрипты можно так:
sh -x /path/to/script
2) Если переменная не выделена пробелами с обеих сторон - то лучше использовать конструкцию ${var}, а не $var. Потому как выражение "$SRC/$q" можно интерпретировать как:

Код: Выделить всё

${S}RC/${q}
${SR}C/${q}
${SRC}/${q}

и, если так случится, что переменная ${SR} будет определена глобально, ваш скрипт может взять значение именно её, а не ваше $SRC.

Вообще, всегда используйте конструкцию ${var} оно и читается лучше, и воспринимается интерпретатором именно так, как нужно.
"Винда съела дрова и резет здесь не фурычит."
"Все говорят, что у меня /dev/hands криво и я всё делаю через /dev/ass. А у меня этих фалов вообще нет!"

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 34924
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Кавычки в if

Непрочитанное сообщение Alex Keda » 2014-11-05 19:55:55

2 скелетор
вообще, конец имени переменной - разделительный символ
слэш, например.

а вот альфабет - это не разделители. так что все они войдут в имя переменной в любом случае
--
2 автор
а причина поведения такого непонятна...
Убей их всех! Бог потом рассортирует...


Вернуться в «SHELL»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость