[: отсутствует `]' ошибка в скрипте Unix | shell

[: отсутствует `]' ошибка в скрипте Unix | shell

24.01.2020 08:35:34 Просмотров 25 Источник

Я получил [: отсутствует `]' ошибка в моем сценарии Unix

memuse=$ free -m                                                                      
if [ $memuse >80]
then                                                               
echo "Attention: memory utilisation is high on $(hostname) at $(date)" 

Это мой код, и я получил ошибку, как

[tonokuriakose@webminal.org ~]$sh ./memory_alert.sh                                   
              total        used        free      shared  buff/cache   available       
Mem:          14522        2128        4004        1845        8389       10096       
Swap:             0           0           0                                           
./memory_alert.sh: line 2: [: missing `]' 
У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/59890882/missing-error-in-unix-shell-script#comment105910027_59890882
Используйте эту ссылку для отладки: shellcheck.net
https://stackoverflow.com/questions/59890882/missing-error-in-unix-shell-script#comment105921819_59890882
Это ответ на ваш вопрос? Bash scripting missing']'

Ответы - [: отсутствует `]' ошибка в скрипте Unix | shell / [: missing `]' error in Unix | shell Script

Manas Kinkar

24.01.2020 08:47:06

ты скучал spaceи fi

memuse=$ free -m                                                                      
if [ $memuse > 80 ];
then                                                               
    echo "Attention: memory utilisation is high on $(hostname) at $(date)"
fi
https://stackoverflow.com/questions/59890882/missing-error-in-unix-shell-script/59890990#comment105910066_59890990
Вы проверили свой опубликованный код?
https://stackoverflow.com/questions/59890882/missing-error-in-unix-shell-script/59890990#comment105910096_59890990
да, я проверил его на месте.
https://stackoverflow.com/questions/59890882/missing-error-in-unix-shell-script/59890990#comment105910156_59890990
Спасибо, Ваш ответ дал мне решение.
Shubham Patel

24.01.2020 08:48:21

Похоже, у вас есть проблема в этой строке memuse=$ free -m

Насколько я понимаю, вы хотели назначить выходные free -mпеременной "memuse", но это неверно. Вместо этого используйте $(command)или `command`. Также добавьте оператор echo для переменной memuse, чтобы проверить, что вы получаете в ответ на команду free -mв переменной memuse. Это будет полезно для вас.

memuse=$(free -m)
echo $memuse

Output

$bash -f main.sh
total used free shared buff/cache available Mem: 257692 3748 244035 3 9909 252827 Swap: 4095 0 4095
https://stackoverflow.com/questions/59890882/missing-error-in-unix-shell-script/59891001#comment105910095_59891001
вы должны добавить исправленный код к вашему ответу для демонстрации.
Ivan

24.01.2020 08:57:44

Ну, есть много проблем. Во-первых, чтобы получить вывод некоторой команды на var, вам нужно это

var=$( some_command )

Во-вторых, выход free -mравен

              total        used        free      shared  buff/cache   available       
Mem:          14522        2128        4004        1845        8389       10096       
Swap:             0           0           0

Как это можно сравнить всего с 80? Посмотрите, что вы пытаетесь сравнить:

"total used free shared buff/cache availableMem: 14522 2128 4004 1845 8389 10096 Swap: 0 0 0" > 80

В-третьих, free -mпоказывает информацию mem в мегабайтах, и я предполагаю, что вы хотите процент, верно? В free. Но на основе "доступно" и "всего" вы можете рассчитать использование mem в%, а затем сравнить его с некоторым предопределенным значением. Хорошо, давайте попробуем это исправить.

#!/bin/bash

memory_alert=80 # this will be an alerting value
memory_total=$( free | sed -n '2p' | awk '{print $2}' ) # get total memory by parsing free output with sed and awk
memory_available=$( free | sed -n '2p' | awk '{print $7}' ) # same with available memory
memory_used=$( echo 100-100*$memory_available/$memory_total | bc ) # calculate memory usage in %

# compare and alert if memory usage more than 80%
(( memory_used > memory_alert )) && echo "Attention: memory utilisation is high on $(hostname) at $(date)"

И более компактный вариант благодаря Гордону

#!/bin/bash
memory_alert=80 # this will be an alerting value
memory_used=$( free | awk 'NR==2 {print int(100-100*$7/$2)}' )
(( memory_used > memory_alert )) && echo "Attention: memory utilisation is high on $(hostname) at $(date)"
https://stackoverflow.com/questions/59890882/missing-error-in-unix-shell-script/59891085#comment105911314_59891085
@KeithThompson, спасибо!)
https://stackoverflow.com/questions/59890882/missing-error-in-unix-shell-script/59891085#comment105911633_59891085
Вы можете попросить awkсделать почти всю работу за вас: memory_used=$( free | awk 'NR==2 {print int(100-100*$7/$2)}' )
https://stackoverflow.com/questions/59890882/missing-error-in-unix-shell-script/59891085#comment105914530_59891085
@GordonDavisson, круто спасибо!
Maaz

24.01.2020 09:18:12

Первая проблема-синтаксическая ошибка в memuse=$ free -m, она должна быть такой:

memuse=$(free -mh)

Во-вторых, в if [ $memuse > 80 ]вы не упомянули ни процент, ни абсолютное значение используемой памяти, если это процент, который вы проверяете, то вам нужно будет вычислить его соответственно, используя формулу процента.

Если это абсолютное значение, то вам придется использовать grep и т. д., Чтобы получить значение используемой памяти и сравнить его с 80.

Tono Kuriakose

24.01.2020 10:00:29

Я нашел решение.

memuse=$ free -m                                                                      
if [ $memuse > 80 ];                                                                  
then                                                                                 
echo "Attention: memory utilisation is high on $(hostname) at $(date)"               
else                                                                                  
echo "Attention : memory utilisation is normal on $(hostname) at $(date)"             
fi 

Это мой первый раз, когда я делаю сценарии bash. Так что вопрос в основном из-за отступа.

Закрыть X