1

У меня есть сценарий bash, завернутый в «», поэтому мне нужно использовать «» для моей команды grep, но она не работает. Я не могу переключать кавычки, потому что тогда переменные не раскрываются.

#!/bin/bash

PWD=`pwd`
source "$PWD/AWS.config.sh"

SCRIPT="
cd ~/$APP_PATH;
netstat -ln | grep ':80 ' &> /dev/null;
if [ $? -eq 0 ]; then
    echo something on 80;
else
    echo nothing on 80;
fi
"
ssh -i $EC2_PEM_FILE $APP_HOST $SCRIPT

Так

netstat -ln | grep ':anyporthere ' &> /dev/null;

кажется, всегда возвращает $? 0 указывает на совпадение, когда его явно нет.

Как я уже упоминал, если я переключаюсь на «» и «» для включающего сценария, он работает, но тогда переменные сценария не раскрываются, что является проблемой.

Пожалуйста помоги.

2 ответа2

2

$? переменная в скрипте подставляется при назначении переменной, а не на удаленном хосте

#!/bin/bash
source "$PWD/AWS.config.sh"

ssh -i "$EC2_PEM_FILE" "$APP_HOST" << END_SCRIPT
    cd ~/"$APP_PATH"
    netstat -ln | grep -q ':80 '
    if [ \$? -eq 0 ]; then
        echo something on 80
    else
        echo nothing on 80
    fi
END_SCRIPT
  • Уже есть переменная bash с именем PWD, поэтому вам не нужно ее назначать.
  • Привыкайте цитировать ваши переменные, если только вы не знаете, когда этого не делать.
  • grep -q тихий, но возвращает тот же статус выхода. Также более эффективный, потому что он сразу выходит, если найдено совпадение, а не ищет остальную часть файла.
  • вам нужно cd просто запустить netstat?

Вы также можете использовать логические операторы короткого замыкания:

ssh -i "$EC2_PEM_FILE" "$APP_HOST" "netstat -ln | grep -q ':80 ' && echo something on 80 || echo nothing on 80"
END_SCRIPT
0

Решено путем объединения строк с разными кавычками .. хотя довольно хакерский. Все еще предпочитаю более хорошее решение

SCRIPT="
blah;
blah;
"
SCRIPT+='
this grep bit " "
'

SCRIPT+="
the rest
"

Fugly ..

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .