> Можно ли сравнивать сначала сроку, потом числа?
> [ "$A" != "возмущено" -a "$cattt" -eq "1" ]; Да, можно.
$ help test | grep AND
EXPR1 -a EXPR2 True if both expr1 AND expr2 are true.
Не важно, строки вы сравниваете или числа, -- и то, и то -- выражения, так что всё ок.
Можно и так, как вы сделали (в контексте test), а можно средствами баша:
1. [ $x != "abc" -a $y -eq 2 ]
2. [ $x != "abc" ] && [ $y -eq 2 ]
Эти выражения делают одно и то же.
> может, проще добавить логическое "и" для проверки.
> Или это хуже?
Ну, если так сильно углубляться...
1. Я бы переделал этот кусок кода:
if [ "$A" = "возмущено" -a "$cattt" -eq "0" ]; then
echo "1" > $var_file
notif
fi if [ "$A" != "возмущено" -a "$cattt" -eq "1" ]; then
echo "0" > $var_file
notif
fi
таким образом:
if [ "$A" = "возмущено" ]; then
if [ $cattt -eq 0 ]; then
echo 1 > $var_file
notif
fi
else
if [ $cattt -eq 1 ]; then
echo 0 > $var_file
notif
fi
fi
Лучше тем, что будет делаться меньше проверок. У вас будет выполняться 4 проверки, а у меня 2. Плюс я избавился от ненужных кавычек.
2. Еще вот этот кусок кода переделал бы:
if [ "$A" = "возмущено" ]; then
echo "Attention! Magnetic Storm" | festival --tts
fi
if [ "$A" != "возмущено" ]; then
echo "There is no anymore" | festival --tts
fi
на такой:
if [ "$A" = "возмущено" ]; then
echo "Attention! Magnetic Storm" | festival --tts
else
echo "There is no anymore" | festival --tts
fi
...или даже на такой:
if [ "$A" = "возмущено" ]; then
msg="Attention! Magnetic Storm"
else
msg="There is no anymore"
fiecho $msg | festival --tts
> что означает flock?
flock -- блокировка с помощью файла. Такой себе аналог мьютекса. Используется, если вы подозреваете, что скрипт может быть выполнен одновременно из нескольких параллельных потоков (процессов), чтобы избежать race conditions.
Суть в том, что каждый раз при выполнении скрипта команда flock проверяет, существует ли lock-файл;
1. если не существует -- создается такой файл и выполняется код, защищенный этим локом
2. если существует -- команда flock будет ждать, пока lock-файл исчезнет (т.е. этот скрипт, выполняющийся в другом потоке, закончит выполнять защищенный локом код и удалит lock-файл), и потом продолжит выполнять код скрипта (защищенный flock). С помощью параметров также можно задать поведение: например, ждать с таймаутом, а потом завершать скрипт, либо просто сразу завершать скрипт.
Чтобы понять, как работает flock, можете проделать следующий эксперимент:
1. В одном терминале запустите команду
flock /tmp/123 -c 'while :; do sleep 1; done'
2. В другом терминале запустите команду
flock /tmp/123 -c 'echo 1'
- flock во втором терминале будет "висеть" и ждать, пока файл /tmp/123 удалится
- файл /tmp/123 удалится тогда, когда завершиться flock в первом терминале
- а в первом терминале под локом выполняется бесконечный цикл
3. Теперь нажмите Ctrl+C в первом терминале, чтобы завершить первый flock
4. Во втором терминале сразу же выполнится команда "echo 1".