Bash 변수 실행

Bash 변수 실행

bash를 배우려고 최선을 다하고 있습니다. 이 예에서는 매개변수 없이 스크립트를 사용합니다.

restart_alfresco.sh
Connection to slql-fresc-bdd1 closed.

Usage: /root/bin/restart_alfresco.sh  status|start|stop|restart

문제는 다음과 같습니다

POSTGRES_STATUS=$(ssh -t root@slql-fresc-bdd1 "ps -f -u alfresco|grep postgres|grep -v UID")

처형되다. $POSTGRES_STATUS를 실행하지 않고 어떻게 사용할 수 있나요?

이것은 내 스크립트입니다.

FLOWER_STATUS="/etc/init.d/flowerGenesisPlugin status"
SOLR_STATUS=$(ps -f -u alfresco|grep -v UID)
ALFRESCO_STATUS=$(ps -f -u alfresco|grep Dalfresco|grep -v UID)
POSTGRES_STATUS=$(ssh -t root@slql-fresc-bdd1 "ps -f -u alfresco|grep postgres|grep -v UID")

usage() {
  # On display usage and exit.
  echo -e "\nUsage: ${0} \033[33m status|start|stop|restart\033[0m\n " >&2
  echo -e '\033[36m [status] \033[0m Permet de voir le status de alfresco, solr et flowergenesis' >&2
  echo -e '\033[36m [restart] \033[0m  Permet de restarter alfresco, solr et flowergenesis' >&2
  echo -e '\033[36m [stop] \033[0m  Permet de stopper solr, alfresco et flowergenesis' >&2
  echo -e '\033[36m [start] \033[0m  Permet de starter alfresco, solr et flowergenesis' >&2
  echo -e "\n"
}

status() {
echo -e "\n"
echo -e "$POSTGRES_STATUS"

if
        [[ -n "${POSTGRES_STATUS}" ]]
        then
        echo -e '\033[36m Postgres est bien start \033[0m' >&2
        else
        echo -e '\033[36m Postgres est eteint \033[0m' >&2
fi

echo -e "\n"
echo -e "$ALFRESCO_STATUS"
${ALFRESCO_STATUS}

if
        [[ -n "${ALFRESCO_STATUS}" ]]
        then
        echo -e '\033[36m Alfresco est bien start \033[0m' >&2
        else
        echo -e '\033[36m Alfresco est bien stop \033[0m' >&2
fi

echo -e "\n"
echo -e "$SOLR_STATUS"|grep -i --color=auto solr &&
${SOLR_STATUS}

if
        [[ -n "${SOLR_STATUS}" ]]
        then
        echo -e '\033[36m Solr est bien start \033[0m' >&2
        else
        echo -e '\033[36m Solr est arrete \033[0m' >&2
fi

echo -e "\n"
${FLOWER_STATUS}
FLOWER_EXIT_STATUS="${?}"

if
        [[ "${FLOWER_EXIT_STATUS}" -eq 0 ]]
        then
        echo -e '\033[36m flowerGenesisPlugin est bien start \033[0m' >&2
        else
        echo -e '\033[36m flowerGenesisPlugin est eteint \033[0m' >&2
fi
}


start() {
echo -e '\033[36m Demarrage de la Base Postgres en cours veuillez patientez \033[0m'
ssh -t root@slql-fresc-bdd1 "service postgres start" &&
service alfresco start &&
service solr start &&
/etc/init.d/flowerGenesisPlugin start
}

stop() {
service solr stop &&
service alfresco stop &&
/etc/init.d/flowerGenesisPlugin stop &&
echo -e "\033[36m Arret de la Base Postgres en cours veuillez patientez \033[0m"
ssh -t root@slql-fresc-bdd1 "service postgres stop"
}

case "$1" in
    status) status ;;
    start)   start ;;
    stop)    stop ;;
    restart) stop; start ;;
    *) usage >&2 ;;
       esac

if [[ "${UID}" -ne 0 ]]
then
  echo 'il faut executer ce script en tant que root' >&2
  usage
fi

# Expect the best
EXIT_STATUS='0'

if [[ "${EXIT_STATUS}" -ne 0 ]]
    then
      EXIT_STATUS=${EXIT_STATUS}
      echo "Execution du script a echoue." >&2
fi

답변1

문제는 인수 없이 스크립트를 실행할 때 use() 함수만 읽고 싶다는 것입니다.

자, 스크립트의 구조와 쉘이 위에서부터 스크립트를 실행한다는 사실을 생각해 보세요.

FLOWER_STATUS="/etc/init.d/flowerGenesisPlugin status"
SOLR_STATUS=$(ps -f -u alfresco|grep -v UID)
ALFRESCO_STATUS=$(ps -f -u alfresco|grep Dalfresco|grep -v UID)
POSTGRES_STATUS=$(ssh -t root@slql-fresc-bdd1 "ps -f -u alfresco|grep postgres|grep -v UID")

usage() {
   ...
}

case "$1" in
    status) status ;;
    start)   start ;;
    stop)    stop ;;
    restart) stop; start ;;
    *) usage >&2 ;;
esac

대본의 첫 번째는 POSTGRES_STATUS친구들에게 주는 숙제다. 여기에는 명령 대체가 포함되어 있습니다.할당할 때. make에 있는 것처럼 쉘에는 게으른 평가가 없습니다. (장착한 것은 제외하고 eval, 거기까지 가지 말자.)

이를 방지하려면 매개변수 검사를 맨 위로 이동하고 할당을 그 아래로 이동하십시오.

usage() {
   echo...
}

case "$1" in 
   ...
   *) usage; exit 1 ;;
esac

POSTGRES_STATUS=...

또는 함수에 할당을 넣고 확인한 후에만 함수를 호출할 수도 있습니다.

usage() {
    echo...
}
check() {
    case "$1" in...
        *) usage; exit 1;;
    esac
}
set_globals() {
    POSTGRES_STATUS=...
}

check
set_globals

코드의 주요 부분을 전용 함수( main()일반적으로)에 넣고 끝에서 호출할 수도 있으므로 함수 정의 외에는 메인 수준에 코드가 없습니다.

답변2

ilkkachu의 도움에 감사드립니다. 더 깔끔한 코드를 얻기 위해 함수를 더 많이 사용하도록 노력하겠습니다.

결국 내 변수를 함수 상태로 설정했습니다.

status() {
local POSTGRES_STATUS=$(ssh -t root@myhost "ps -f -u process|grep postgres|grep -v UID")
echo -e "\n"
echo -e "$POSTGRES_STATUS"

관련 정보