2013-08-14 1 views
1

MySQL 데이터베이스에서 숫자를 확인하는 작은 BASH 스크립트를 작성하려고합니다. 숫자가 이미 테이블에있는 경우 echo "AHHH THAT'S ALREADY THERE"으로 설정하고 데이터베이스에 이미 삽입되어 있지 않은 경우 필드가 존재하면 MySQL과 BASH에서 "something"을 echo하고, 그렇지 않으면 테이블에 삽입 - Output to variable?

mysql --host=192.168.0.0 --user=garfunkle --password=spatulaface mylovelydb << EOF 
SELECT * FROM mylittletable WHERE thenumber=$THENUMBER ; 
EOF 

mysql --host=192.168.0.0 --user=garfunkle --password=spatulaface mylovelydb << EOF 
INSERT INTO mylittletable VALUES ('$THENUMBER,'$THEDATE'); 
EOF 

나는 출발점이 변수로 MySQL의 쿼리의 출력을 넣어하는 것 같아요?

+0

가능한 중복/7301780/put-results-of-mysql-command-line-query-into-bash-script-variable) –

+0

도움이 되긴하지만, 실제로 "이미 존재한다면"비트가 필요합니다. .! –

답변

2

사실, Bash에서는 쿼리 결과를 테스트하는 것을 잊어 버립니다. 당신이 를 넣어 경우 thenumber 열이 기본 키 인 경우, 또는 :

INSERT INTO mylittletable(thenumber, thedate) 
SELECT * FROM (SELECT '$THENUMBER', '$THEDATE') AS tmp 
WHERE NOT EXISTS (
    SELECT 1 FROM mylittletable WHERE thenumber = '$THENUMBER' 
) LIMIT 1; 

도 간단을 : 당신은 단지 하나의 SQL 쿼리를 사용하면 (존재하지 않는 경우에만 즉, 데이터를 삽입) 원하는 것을 할 수 있습니다 거기에 UNIQUE 제약, 당신은 단지 (같은 번호를 삽입 할 때 자동으로 실패이 쿼리를 만들 것입니다) INSERT IGNORE가 사용할 수 있습니다

INSERT IGNORE INTO mylittletable VALUES ('$THENUMBER','$THEDATE'); 

개인적으로, 나는 그 두 번째 옵션과 함께 갈 것입니다. 그것은 당신의 데이터에 대한 의미가있는 경우 UNIQUE 제약 조건을 만드는 것이 좋습니다 (또는 테이블이 이미 하나를 가지고 있지 않은 경우 thenumber 기본 키를 만들) :

ALTER TABLE mylittletable ADD UNIQUE(thenumber); 

편집 :

당신이 배쉬를 원하는 경우 문제의 경우 출력 뭔가, 그냥 INSERT (IGNORE없이)를 수행하고, MySQL의 클라이언트 프로그램의 종료 상태 사용 : 당신이 좋아하지 않는 경우 또는

echo "INSERT INTO mylittletable VALUES ($THENUMBER,'$THEDATE');" | mysql --host=192.168.0.0 --user=garfunkle --password=spatulaface mylovelydb 2> /dev/null || echo Warning! 

을 긴 하나 - 라이너 : 경우

mysql --host=192.168.0.0 --user=garfunkle --password=spatulaface mylovelydb 2> /dev/null << EOF 
INSERT INTO mylittletable VALUES ($THENUMBER,'$THEDATE'); 
EOF 

if [ $? -neq 0 ] 
then 
    echo Warning! 
fi 

당신이 익숙하지 않은는 || 운영자는 배쉬에서 다음과 같이 사용된다 : 그래서 2> /dev/null :

# If command1 fails, run command2 
command1 || command2 
# Silly example 
ls myfile 2> /dev/null || echo "No myfile here!" 

공지 또한 오류 리디렉션을 사용 오류는 콘솔에 출력되지 않습니다.

+0

우수! 그 숫자가 이미 존재한다면 Bash는 경고 메시지를 울리게 할 수 있습니까? (문제의 번호가 역시 그 기본 키입니다.) –

+0

수정 된 답변보기 –

+0

이것은 나를 위해 작동하는 것 같습니다 :) 감사합니다! –

0

시도해 볼 수도 있습니다.

#!/bin/bash 

if read COUNT < <(mysql --host=192.168.0.0 --user=garfunkle --password=spatulaface -E mylovelydb <<< "SELECT COUNT(*) AS __COUNT__ FROM mylittletable WHERE thenumber=$THENUMBER;" | sed -ne '/^__COUNT__/{ s/^.* //; p; }') && [[ COUNT -gt 0 ]]; then 
    echo "AHHH THAT'S ALREADY THERE" 
else 
    mysql --host=192.168.0.0 --user=garfunkle --password=spatulaface mylovelydb <<< "INSERT INTO mylittletable VALUES ('$THENUMBER,'$THEDATE');" 
fi 

당신은 그들에게 변수로 확장 좀 만들 끄트머리 수 : (http://stackoverflow.com/questions를 [bash는 스크립트 변수로 MySQL의 명령 줄 쿼리의 결과를 넣어]의

#!/bin/bash 

SELECTCOMMAND="SELECT COUNT(*) AS __COUNT__ FROM mylittletable WHERE thenumber=$THENUMBER;" 
INSERTCOMMAND="INSERT INTO mylittletable VALUES ('$THENUMBER,'$THEDATE');" 

if read COUNT < <(mysql --host=192.168.0.0 --user=garfunkle --password=spatulaface -E mylovelydb <<< "$SELECTCOMMAND" | sed -ne '/^__COUNT__/{ s/^.* //; p; }') && [[ COUNT -gt 0 ]]; then 
    echo "AHHH THAT'S ALREADY THERE" 
else 
    mysql --host=192.168.0.0 --user=garfunkle --password=spatulaface mylovelydb <<< "$INSERTCOMMAND" 
fi 
관련 문제