Кавычки в if

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
lazhu
сержант
Сообщения: 254
Зарегистрирован: 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
Может кто-то объяснить уличную магию?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
skeletor
майор
Сообщения: 2548
Зарегистрирован: 2007-11-16 18:22:04

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} оно и читается лучше, и воспринимается интерпретатором именно так, как нужно.

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

Re: Кавычки в if

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

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

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