Oluşturulan .sql
dosyayı içe aktarma sürecini "otomatikleştirmek" için dosyaları iletmeye çalışırken gizlenebilecek tüm tuzaklardan kaçınırken stdin
ve stdout
MySQL'e oluşturulan .sql
dosyayıSOURCE
komutu .
Kısa, ama mükemmel sözdizimi cevap , gelen Kshitij Sood , iyi başlangıç noktası verir. Kısaca, OP'nin komutunu Kshitij Sood'un sözdizimine göre değiştirin ve içindeki komutları şu SOURCE
komutla değiştirin:
#!/bin/bash
mysql -u$user -p$password $dbname -Bse "SOURCE ds_fbids.sql
SOURCE ds_fbidx.sql"
Veritabanı adı oluşturulan .sql
dosyaya komuttan çıkarılabilir.
Buradaki varsayım, oluşturulan dosyanın kendi başına bir dosya olarak geçerli olmasıdır.sql
. Dosyanın yeniden yönlendirilmemesi, borulanması veya başka bir şekilde kabuk tarafından işlenmemesi, kabuk nedeniyle üretilen çıktıdaki herhangi bir karakterden çıkma gereksinimi ile ilgili bir sorun yoktur. Bir .sql
dosyada neyin kaçması gerektiğine ilişkin kurallar elbette hala geçerlidir.
Komut satırındaki veya bir my.cnf
dosyadaki vb . Güvenlik sorunları ile nasıl başa çıkılacağı , bazı mükemmel önerilerle diğer yanıtlarda iyi bir şekilde ele alınmıştır. Benim favori cevap itibaren, Danny , kapaklar ile uğraşırken sorunu nasıl ele dahil olduğu, cron
iş, veya başka bir şey.
Bahsettiğim kısa cevapla ilgili bir yorumu (soru?) Ele almak için: Hayır, bu kabuk komutu verildiği için bir HEREDOC sözdizimi ile kullanılamaz. HEREDOC, G / Ç yeniden yönlendirmesinin inşa edildiği şey olduğundan, HEREDOC yeniden yönlendirme sürümü sözdiziminde ( -Bse
seçenek olmadan ) kullanılabilir. HEREDOC işlevselliğine ihtiyacınız varsa, onu .sql
geçici bir dosya oluştururken kullanmak ve bu dosyayı MySQL toplu iş satırıyla yürütmek için "komut" olarak kullanmak daha iyi olacaktır .
#!/bin/bash
cat >temp.sql <<SQL_STATEMENTS
...
SELECT \`column_name\` FROM \`table_name\` WHERE \`column_name\`='$shell_variable';
...
SQL_STATEMENTS
mysql -u $user -p$password $db_name -Be "SOURCE temp.sql"
rm -f temp.sql
Kabuk genişlemesi nedeniyle HEREDOC içindeki kabuk ve ortam değişkenlerini kullanabileceğinizi unutmayın. Olumsuz tarafı, her ters vuruştan kaçmanız gerektiğidir . MySQL bunları tanımlayıcılar için sınırlayıcılar olarak kullanır, ancak dizeyi ilk alan kabuk bunları çalıştırılabilir komut sınırlayıcıları olarak kullanır. MySQL komutlarının tek bir backtickinde kaçışı kaçırırsanız her şey hatalarla patlar. Tüm sorun HEREDOC için alıntılanmış bir LimitString kullanılarak çözülebilir:
#!/bin/bash
cat >temp.sql <<'SQL_STATEMENTS'
...
SELECT `column_name` FROM `table_name` WHERE `column_name`='constant_value';
...
SQL_STATEMENTS
mysql -u $user -p$password $db_name -Be "SOURCE temp.sql"
rm -f temp.sql
Kabuk genişletmesinin bu şekilde kaldırılması, geri işaretlerden ve diğer özel kabuk karakterlerinden kaçma ihtiyacını ortadan kaldırır. Ayrıca, içindeki kabuk ve ortam değişkenlerini kullanma yeteneğini de kaldırır. Bu, başlangıçta kabuk betiği içinde bir HEREDOC kullanmanın faydalarını hemen hemen ortadan kaldırır.
Diğer seçenek, Bash'de izin verilen çok satırlı alıntı dizelerini toplu sözdizimi sürümüyle (ile -Bse
) kullanmaktır. Başka mermileri bilmiyorum, bu yüzden onların da orada çalışıp çalışmadığını söyleyemem. Birden fazla çalıştırmak için kullanmak gerekir .sql
dosyayı SOURCE
yani bu yana, zaten komutu değil bir sonlandırıldı ;
diğer MySQL komutları gibi ve sadece bir satıra izin verilir. Çok satırlı dizge tek veya çift tırnaklı olabilir ve kabuk genişlemesi üzerindeki normal etkiler. Ayrıca HEREDOC sözdiziminin geri işaretler için yaptığı gibi aynı uyarılara sahiptir.
Potansiyel olarak daha iyi bir çözüm .sql
, OP'nin yaptığı gibi dosyayı oluşturmak için bir komut dosyası dili, Perl, Python vb. SOURCE
Kullanmak ve bu dosyayı en üstteki basit komut sözdizimini kullanarak yapmak olacaktır. Komut dosyası dilleri, dize işlemede kabuktan çok daha iyidir ve çoğu MySQL ile uğraşırken gereken alıntı ve kaçış işlemlerini işlemek için yerleşik prosedürlere sahiptir.