> Можно ли сравнивать  сначала сроку, потом числа?
> [ "$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".