LINUX.ORG.RU

как выполнить команду в скрипте bash?

 


1

3

Мой первый скрипт, и сразу грабли! В консоли команды выполняются, а в скрипте нет, в чем грабли?

relay=$(sudo /home/pi/usbrelay/usbrelay/usbrelay | grep 7ASOC_1)
datchik=$(cat /home/pi/co2moon/co2mon-master/build/co2mond/log/CntR)

весь скрипт

#!/bin/bash
relay=$(sudo /home/pi/usbrelay/usbrelay/usbrelay | grep 7ASOC_1)
datchik=$(cat /home/pi/co2moon/co2mon-master/build/co2mond/log/CntR)
if [[ "$relay" == 7ASOC_1=0 ]] && [["$datchik" > 1000 ]]
then
sudo /home/pi/usbrelay/usbrelay/usbrelay 7ASOC_1=1
fi
if [[ "$relay" == 7ASOC_1=1 ]] && [["$datchik" < 300 ]]
then
sudo /home/pi/usbrelay/usbrelay/usbrelay 7ASOC_1=0
fi
exit 0

Во-первых, почитайте что-нибудь про отступы или возьмите редактор, который из будет расставлять за вас.

relay=$(sudo /home/pi/usbrelay/usbrelay/usbrelay | grep 7ASOC_1)
sudo /home/pi/usbrelay/usbrelay/usbrelay 7ASOC_1=1
sudo /home/pi/usbrelay/usbrelay/usbrelay 7ASOC_1=0

Запускать, что-либо по sudo из сценария, разумеется, можно, но если он у вас целиком из таких вызовов, то не лучше ли весь скрипт пускать со сверхпользовательскими правами?

[["$datchik" > 1000 ]]

1. Это синтаксическая ошибка: [[ и ]] всегда обрамляются пробелами.

2. Это не арифметическое сравнение, а лексикографическое. То есть [[ 500 > 1000 ]] — истина.

Если это то, что вам и нужно, то добавьте что ли «sic» в комментарий, ибо сразу рука тянется исправить. А если нет, то вам нужны круглые скобки: (( datchik > 1000 )).

Zmicier ★★★★★ ()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от blexey

"$relay" == 7ASOC_1=0
А что сие значит?

Это проверка на то, что переменная $relay равна строке 7ASOC_1=0.

Очевидно, где-то не хватает кавычек.

И где же?

Zmicier ★★★★★ ()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от blexey

А что сие значит? Очевидно, где-то нехватает кавычек.

Как ни странно, но они тут даже лишние.

ashot ★★★★ ()

Вот сделал, почему то datchik=$() вот так не понимает что внутри команда, надо почитать, а то несколько дней эти три строчки делал ))

#!/bin/bash
datchik=`cat /home/pi/co2moon/co2mon-master/build/co2mond/log/CntR`
rele=`sudo /home/pi/usbrelay/usbrelay/usbrelay | grep 7ASOC_1`
echo $datchik
echo $rele

if [[ $datchik -gt "1000" ]] && [[ $rele = "7ASOC_1=0" ]]
then sudo /home/pi/usbrelay/usbrelay/usbrelay 7ASOC_1=1
else echo "воздух в норме"
fi

if [[ $datchik -lt "300" ]] && [[ $rele = "7ASOC_1=1" ]]
then sudo /home/pi/usbrelay/usbrelay/usbrelay 7ASOC_1=0
else echo "воздух в норме"
fi

mazzick ()
Ответ на: комментарий от EugeneBas

да я так и сделал, сначала не те кавычки использовал, и долго думал почему не работает )) еле нашел

mazzick ()
Ответ на: комментарий от mazzick

Ну либо путь указан не верно, либо нет прав у пользователя от которого выполняется скрипт. Можешь конечно через sudo попробовать, раз оно у тебя в каждой второй команде.

sudo sh -c 'cat /home...', вот как-то так.

Deleted ()
Ответ на: комментарий от EugeneBas

возможно разные интерпретаторы по разному воспринимают эти конструкции

Не понял. Откуда возьмутся разные интерпретаторы, при наличии шабанга?

ashot ★★★★ ()
Ответ на: комментарий от mazzick

datchik=$() вот так не понимает что внутри команда

А если так:

datchik=$(< /home/pi/co2moon/co2mon-master/build/co2mond/log/CntR)
И ещё
bash --version
посмотреть бы.

ashot ★★★★ ()
Ответ на: комментарий от theNamelessOne

Так и не понял что ты имеешь в виду под: «нормального nesting'а нет». Необходимость экранировать внутренние апострофы? Ну так эта форма записи и считается устаревшей, о чём в мане и написано. Но работает же.

ashot ★★★★ ()
Ответ на: комментарий от ashot

Необходимость экранировать внутренние апострофы?

Да.

Но работает же.

Но смысл использовать её, если можно использовать $(…)?

theNamelessOne ★★★★★ ()
Ответ на: комментарий от theNamelessOne

Но смысл использовать её, если можно использовать $(…)?

Так именно это я и пытался выяснить, когда ТСу посоветовали заменить «$(» на «`». И это был не я.))

ashot ★★★★ ()
Последнее исправление: ashot (всего исправлений: 1)
Ответ на: комментарий от ashot

вот именно при его наличии и может взяться, потому что путь в шабанге может отличаться от того, что для юзера проставлено по дефолту и вполне может возникнуть ситуация, когда просто в эмуляторе терминала команда выполняется, а в скрипте - нет

EugeneBas ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.