Страница 1 из 1

Кавычки в if

Добавлено: 2014-10-31 19:58:52
lazhu
Вопрос на засыпку.
Есть вот такой скриптик:

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

#!/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
Может кто-то объяснить уличную магию?

Re: Кавычки в if

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

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

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

Вообще, всегда используйте конструкцию ${var} оно и читается лучше, и воспринимается интерпретатором именно так, как нужно.

Re: Кавычки в if

Добавлено: 2014-11-05 19:55:55
Alex Keda
2 скелетор
вообще, конец имени переменной - разделительный символ
слэш, например.

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