2013-10-13 3 views
0

나는 그와 같이 보이는 bash 스크립트를 만들고있다. 아이디어는 : mysql 사용자, 데이터베이스를 생성하고 새로 생성 된 db에 대해이 사용자에게 모든 권한을 부여하는 스크립트를 작성하는 것입니다.이상한 우분투 bash 문제

SED=`which sed` 
CURRENT_DIR=`dirname $0` 

if [ -z $1 ]; then 
    echo "No domain name given" 
    exit 1 
fi 
DOMAIN=$1 

# check the domain is valid! 
PATTERN="^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$"; 
if [[ "$DOMAIN" =~ $PATTERN ]]; then 
    DOMAIN=`echo $DOMAIN | tr '[A-Z]' '[a-z]'` 
    echo "Creating hosting for:" $DOMAIN 
else 
    echo "invalid domain name" 
    exit 1 
fi 

    echo "Do you want to create MySQL DB for Website (Y/n)?" 
read CREATEDB 

if [[ ($CREATEDB == "y") || (-z "$CREATEDB") ]]; then 
    echo "Enter MySQL root login (leave blank for default value - root):" 
    read MYSQLLOGIN 
    if [ -z "$MYSQLLOGIN" ]; then 
     MYSQLLOGIN="root" 
    fi 
    echo "Enter MySQL root PASS:" 
    read MYSQLROOTPASS 
    if [ -z "$MYSQLROOTPASS" ]; then 
     echo "No way without pass" 
     exit 1 
    fi 
    echo "Enter DB name (leave blank for default value - username_db):" 
    read MYSQLDB 
    if [ -z "$MYSQLDB" ]; then 
     MYSQLDB=$USERNAME"_db" 
    fi 
    echo "Enter password for newly created MySQL user (!ONLY if you have pwgen - sudo apt-get install pwgen! leave blank for auto password creation):" 
    read MYSQLPASS 
    if [ -z "$MYSQLPASS" ]; then 
     MYSQLPASS=$(pwgen -acn 10 1) 
    fi 
    mysql -h localhost -u $MYSQLLOGIN -p$MYSQLROOTPASS; 
    mysql> CREATE USER [email protected]'localhost' IDENTIFIED BY $MYSQLPASS; 
    mysql> create database $MYSQLDB; 
    mysql> grant usage on *.* to [email protected] identified by $MYSQLPASS; 
    mysql> grant all privileges on $MYSQLDB.* to [email protected] ; 
else 
exit 1 
fi 

echo -e "\nSite Created for $DOMAIN with PHP support\n Domain: "$DOMAIN"\n MySQL DB Name: "$MYSQLDB"\nMySQL Username : Pass"$USERNAME" : "$MYSQLPASS ; 

내가 뭘 잘못하고 있니? 점점 다음 오류 :

enter image description here

답변

4

오류가 라인에서 강조되고있다 : 당신은 [, ]에 공백이 필요

if[$MYSQLDB==""]; then 

== 운영자, 말 :

if [ $MYSQLDB == "" ]; then 

다른 곳에서도 같은 문제가 발생합니다. 예를 들어, 당신은 말을하는지 :

if [$CREATEDB == "y"]; then 
if[$MYSQLLOGIN==""]; then 
if[$MYSQLPASS==""]; then 

은 또한, 다음은 작동하지 않을 것입니다 : 당신은 heredoc를 사용할 필요가

mysql -h localhost -u $MYSQLLOGIN -p$MYSQLROOTPASS; 
mysql> CREATE USER [email protected]'localhost' IDENTIFIED BY $MYSQLPASS; 
mysql> create database $MYSQLDB; 
mysql> grant usage on *.* to [email protected] identified by $MYSQLPASS; 
mysql> grant all privileges on $MYSQLDB.* to [email protected] ; 

.

+0

코드를 수정 해 주실 수 있습니까? 나는 당신이 말한대로 여전히 동일한 오류가 발생했습니다 – heron

+0

@heron 그'if'를 위해'fi' 문이 필요할 것 같습니다. – devnull

+0

@devnull : 솔직히이 스크립트에는 * lot *이 없거나 누락되었습니다. 귀하의 인내심에 +1 ... – thkala

2

라인

if[$MYSQLLOGIN==""]; then 

적어도 다음과 같은 구문 오류가 있습니다

그것은 if[ 사이에 공간이 필요
  • -if[이 유효 bash는 구문

  • 되지 않습니다이후에 공간이 필요합니다. [-[== (MYSQLLOGIN가 비어있을 때) 유효한 명령하지

  • 그것은 내가, 그것은 또한 당신의 변수에 큰 따옴표가 필요하다고 주장 것이 문제를 방지하기 위해 ]

  • 전에 공간을 필요로

  • 텍스트를 입력 : "$MYSQLLOGIN"

그래서 올바른 버전은 다음과 같습니다

if [ "$MYSQLLOGIN" == "" ]; then 

코드의 다른 부분에서도 같은 실수가 반복되므로이를 수정해야합니다.

+0

과 같은 오류로 계속 도와주세요. 코드를 수정 해 주시겠습니까? – heron

+0

좋아요, 모든 버그가 수정되었습니다. 그러나 MySQL 명령은 실행되지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? \t mysql을 -h localhost를 -u $ MYSQLLOGIN -p $ MYSQLROOTPASS < \t는 "사용자 $ 사용자 이름을 CREATE 에코 @ $ MYSQLPASS로 식별 '은 로컬 호스트'; \t 데이터베이스 $의 MYSQLDB을 만들; \t 보조금 사용에 * * $의 사용자 이름 @. $ MYSQLPASS에 의해 식별 된 로컬 호스트 \t $ MYSQLDB. *에 대한 모든 권한 부여, $ USERNAME @ localhost "; – heron