2009-10-28 13 views
31

Potrzebuję zmiennej do przechowywania wyników pobranych z bazy danych. Jak dotąd jest to w zasadzie to, co próbuję bez powodzenia.skrypt bash - wybierz z bazy danych do zmiennej

myvariable=$(mysql database -u $user -p $password | SELECT A, B, C FROM table_a) 

Moje rozumienie poleceń basha nie jest bardzo dobre, jak widać.

Odpowiedz

33

nie wiem zbyt wiele o interfejsie wiersza poleceń MySQL, ale zakładając, trzeba tylko pomóc w walnąć, należy spróbować albo zamienić poleceń wokół tak:

myvariable=$(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p$password) 

który Echos ciąg do MySQL. Albo, możesz być bardziej wyszukane i wykorzystywać nowe funkcje bash (tu ciąg)

myvariable=$(mysql database -u $user -p$password<<<"SELECT A, B, C FROM table_a") 

skutkujących samo (zakładając że używasz wystarczająco najnowszej wersji bash), bez angażowania echo.

Należy pamiętać, że hasło -p $ nie jest literówką, ale jest sposobem w jaki MySQL spodziewa się wprowadzenia haseł za pomocą wiersza poleceń (bez spacji między opcją a wartością).

Zauważ, że myvariable będzie zawierał wszystko, co MySQL generuje na wyjściu standardowym (zwykle wszystko oprócz komunikatów o błędach), w tym wszystkie nagłówki kolumn, ramki ASCII-art i tak dalej, które mogą być lub nie być tym, co chcesz.

EDIT:
Jak już wspomniano, wydaje się być parametrem do MySQL -e, pójdę do tej jednej, zdecydowanie.

+0

Dzięki, komenda mysql również nie podobała się -p .. Potrzebowałem użyć --password = $ password. – imnotneo

+1

Możesz również dodać plik konfiguracyjny (o nazwie .my.cnf) do swojego katalogu domowego, który automatycznie włączy opcje. To pozwoliłoby zaoszczędzić trochę zamieszania w twoim skrypcie – Yitzchak

+0

+1 od .my.cnf - szczególnie po to, aby uzyskać hasła ze skryptów. Opcja -N jest przydatna do przycinania nazw pól. – ErichBSchulz

12

Masz rurę na odwrót i trzeba powtórzyć kwerendę, podobnie jak to:

myvariable=$(echo "SELECT A, B, C FROM table_a" | mysql db -u $user -p $password) 

Inną alternatywą jest użycie tylko klient mysql, jak to

myvariable=$(mysql db -u $user -p $password -se "SELECT A, B, C FROM table_a") 

(-s jest wymagane, aby uniknąć ASCII-art)

teraz, bash nie jest najbardziej odpowiedni język do obsługi tego typu scenariuszy, zwłaszcza do obsługi ciągów nd dzielenia wyników SQL i tym podobne. Trzeba dużo pracować, aby uzyskać rzeczy, które byłyby bardzo, bardzo proste w Perlu, Pythonie lub PHP.

Na przykład, w jaki sposób otrzymasz każdy z A, B i C na swojej własnej zmiennej? Z pewnością jest to wykonalne, ale jeśli nie rozumiesz rur i echa (bardzo podstawowe elementy powłoki), nie będzie to łatwe zadanie, więc jeśli w ogóle będę mógł, użyję lepiej dopasowanego języka.

44

Bardziej bezpośrednim sposobem byłoby:

myvar=$(mysql mydatabase -u $user -p$password -se "SELECT a, b, c FROM table_a") 
+5

Szukałem s param, chociaż trzeba go podać dwukrotnie, aby pominąć nazwy kolumn do wydrukowania. –

+0

Ten shoud będzie najlepszą odpowiedzią, nie zwróci nazwy kolumny! – user3479125

+1

Myślę, że białe spacje między '-p' i hasłem muszą zostać usunięte. – frb

14

Aby przeczytać linia po linii danych do tablicy bash można to zrobić:

while read -a row 
do 
    echo "..${row[0]}..${row[1]}..${row[2]}.." 
done < <(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p $password) 

Albo na poszczególne zmienne:

while read a b c 
do 
    echo "..${a}..${b}..${c}.." 
done < <(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p $password) 
+0

'błąd składniowy w pobliżu nieoczekiwanego tokenu' <' cut.sh: linia 26: 'done <<' – thevoipman

+0

@thevoipman: Prawdopodobnie twój skrypt nie używa Bash. Co mówi twój shebang? Ponadto, ponieważ nie widzę twojego skryptu, nie widzę, gdzie może być błąd. –

+0

@thevoipman Zastąpienie procesu wydaje się być twoim problemem (tak, wiem, rok temu, tylko, jeśli ktoś przyjdzie na wygląd), ale może być możliwe odwrócenie za pomocą potoku zamiast dowolnej powłoki, której używasz, tj. 'echo ... | mysql ... | podczas czytania -a wiersz; robić ...; done'. Pamiętaj, że ciało w ciele jest podparte i nie ma wpływu na otoczkę. – falstro

3
myvariable=$(mysql database -u $user -p$password | SELECT A, B, C FROM table_a) 

bez pustej przestrzeni po -p. To trywialne, ale bez skutku.

0
myvariable=$(mysql -u user -p'password' -s -N <<QUERY_INPUT 
    use databaseName; 
    SELECT fieldName FROM tablename WHERE filedName='fieldValue'; 
QUERY_INPUT 
) 
echo "myvariable=$myvariable" 
+0

Podając kod, który rozwiązuje problem, najlepiej jest również podać przynajmniej krótkie wyjaśnienie, jak to działa, aby czytanie osób nie musiało analizować go mentalnie po linii, aby zrozumieć różnice. – Fluffeh

5

Jeśli chcesz użyć pojedynczego wartości użytkowej bash:

companyid=$(mysql --user=$Username --password=$Password --database=$Database -s --execute="select CompanyID from mytable limit 1;"|cut -f1) 

    echo "$companyid" 
+0

to naprawdę odczytuje pojedynczą wartość do zmiennej – bebbo

0

Innym przykładem, kiedy nazwa tabeli lub bazy danych zawiera znaki nieobsługiwane takich jak przestrzeń, lub „-”

db='data-base' 

db_d='' 
db_d+='`' 
db_d+=$db 
db_d+='`' 

myvariable=`mysql --user=$user --password=$password -e "SELECT A, B, C FROM $db_d.table_a;"` 
0

Jeśli masz konkretną nazwę bazy danych i host, na którym chcesz wykonać kwerendę, wykonaj następujące zapytanie:

outputofquery = $ (mysql -u "$ dbusername" -p "$ hasło_bazy_danych" -h "$ dbhostname" -e "SELECT A, B, C table_a"; $ dbname)

więc do uruchomienia kwerendy mysql musisz zainstalować klienta mysql na Linuksie

Powiązane problemy