Кавычки в if

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.

Ответить


Этот вопрос предназначен для предотвращения автоматической отправки форм спам-ботами.
Смайлики
:smile: :( ;-) :roll: :pardon: 8) :x :oops: :shock: :cz2: :-D :ROFL: :Yahoo!: :cry: :Search: :Bravo: :good: :bad: :sorry: :no: :unknown: :evil: :crazy: :"": :fool: :-o :drinks: :st: :bn:
Ещё смайлики…

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[flash] ОТКЛЮЧЕН
[url] ВКЛЮЧЁН
Смайлики ВКЛЮЧЕНЫ

Обзор темы
   

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Развернуть Обзор темы: Кавычки в if

Re: Кавычки в if

Сообщение Alex Keda » 2014-11-05 19:55:55

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

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

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

Кавычки в 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

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

Вернуться к началу