Oluşturulan .sqldosyayı içe aktarma sürecini "otomatikleştirmek" için dosyaları iletmeye çalışırken gizlenebilecek tüm tuzaklardan kaçınırken stdinve stdoutMySQL'e oluşturulan .sqldosyayı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 SOURCEkomutla 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 .sqldosyada neyin kaçması gerektiğine ilişkin kurallar elbette hala geçerlidir.
Komut satırındaki veya bir my.cnfdosyadaki 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, croniş, 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 ( -Bseseçenek olmadan ) kullanılabilir. HEREDOC işlevselliğine ihtiyacınız varsa, onu .sqlgeç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 .sqldosyayı SOURCEyani 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. SOURCEKullanmak 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.