Çok satırlı bir kabuk değişkeni nasıl belirtilir?


122

Bir sorgu yazdım:

function print_ui_hosts
{
local sql = "select ........."
print_sql "$ sql"
}

yerel sql - çok uzun bir dizge. Sorgu formatlanmamış. Bir dizeyi birden çok satıra nasıl bölebilirim?


4
shellBurada ne konuşuyor? Meli batcholmak bashveya darkside gelen gerçekten?
Chris Seymour

1
eğer bu kabuk / bash ise, =boşluklarla çevrelememelisiniz .
Nik O'Lai

Yanıtlar:


138

readAşağıda gösterildiği gibi bir yorum ile kullanın :

read -d '' sql << EOF
select c1, c2 from foo
where c1='something'
EOF

echo "$sql"

52
readBu durumda çıkış kodunun 1 olacağını unutmayın ; bu önemliyse ( set -eörneğin ile koşuyorsanız ), || trueilk satırın sonuna bir eklemek isteyeceksiniz .
chepner

4
set -ebir komut "beklenmeyen" sıfırdan farklı bir çıkış durumuna sahipse kabuktan çıkar. "Öngörülemeyen" derken, özellikle çıkış durumuna bakmadığınız bir bağlamda çalıştığını söylüyorum. falseörneğin kendi başına kabuktan çıkar. false || trueolmaz, çünkü ilk başarısız olursa çalışacak başka bir komut belirterek sıfırdan farklı çıkış durumunu öngörüyorsunuz.
chepner

1
Set -e ve read (son alıştırmaya bakın) ile ilgili problem burada ayrıntılı olarak açıklanmıştır: mywiki.wooledge.org/BashFAQ/105
Niklas Peter

5
-d ' 'burada ne iş var?
hg_git

3
@hg_git readBir satırsonu ile karşılaştığında okumayı bırakmamayı söylemek .
Cyker

171

sadece gerektiğinde yeni bir satır ekleyin

sql="
SELECT c1, c2
from Table1, Table2
where ...
"

kabuk kapanış tırnak işaretini arayacaktır


7
sql sorgusu çift tırnak içeriyorsa iyi bir çözüm değildir. Onlardan kaçmanız gerekecek ve her şey dağınık olacak.
dogbane

13
@dogbane çift tırnak işaretleri çoğu SQL lehçesinde nadiren görünür, bu nedenle pratikte bu temizdir.
Iain Samuel McLean Elder

4
Ardından dizeyi tek tırnak içine alın.
üçlü

Baştaki satır sonunu neden istediğinizden veya buna ihtiyacınız olduğundan emin değilim. Başvurum için yapmadım, bu yüzden yeni başladımsql="SELECT c2, c2
bhfailor

1
Gerçek olamayacak kadar kolay görünmesi komik. Bilginize, DQ eklemek için, sadece bir DQ = '\ "' değişkeni oluşturun ve ardından ifadede $ {DQ} ile referans verin.
Timothy C. Quinn

69

Diğer cevaplar çoğu durumda yeterli olurken, bir cevap daha vermek istiyorum.

Birden çok satıra bir dizgi yazmak istedim, ancak içeriğinin tek satır olması gerekiyordu.

sql="                       \
SELECT c1, c2               \
from Table1, ${TABLE2}      \
where ...                   \
"

Bu biraz konu dışı ise özür dilerim (SQL için buna ihtiyacım yoktu). Bununla birlikte, bu gönderi, çok satırlı kabuk değişkenleri aranırken ilk sonuçlar arasında ortaya çıkıyor ve ek bir cevap uygun görünüyordu.


1
\ 'Ler olmadan bile içeriğim tek satırda çıkıyor.
papiro

12
@papiro, echo "$sql"bunun yerine deneyin echo $sql.
Michael Mol

@MichaelMol - İlk Linux kurulumumdan yaklaşık yirmi yıl sonra ve hala yeni bir şeyler öğreniyorum. Bu "numara" için teşekkürler.
Seth

6

Sayesinde benzer bir soruya dimo414 cevabı , kolayca yanı metinde tırnak ve değişkenleri sahip olabileceği bu onun harika bir çözüm nasıl çalıştığını gösterir ve gösteriler:

örnek çıktı

$ ./test.sh

The text from the example function is:
  Welcome dev: Would you "like" to know how many 'files' there are in /tmp?

  There are "      38" files in /tmp, according to the "wc" command

test.sh

#!/bin/bash

function text1()
{
  COUNT=$(\ls /tmp | wc -l)
cat <<EOF

  $1 Would you "like" to know how many 'files' there are in /tmp?

  There are "$COUNT" files in /tmp, according to the "wc" command

EOF
}

function main()
{
  OUT=$(text1 "Welcome dev:")
  echo "The text from the example function is: $OUT"
}

main

5

readdeğişkeni dışa aktarmaz (bu çoğu zaman iyi bir şeydir). İşte tek bir komutla dışa aktarılabilen, satır beslemelerini koruyabilen veya atabilen ve gerektiğinde alıntı stillerinin karıştırılmasına izin veren bir alternatif. Bash ve zsh için çalışıyor.

oneLine=$(printf %s \
    a   \
    " b "   \
    $'\tc\t'    \
    'd '    \
)
multiLine=$(printf '%s\n' \
    a   \
    " b "   \
    $'\tc\t'    \
    'd '    \
)

Alıntı yapma ihtiyacının SQL için bunu çirkinleştirdiğini kabul ediyorum, ancak başlıktaki (daha genel olarak ifade edilen) soruyu yanıtlıyor.

Bunu böyle kullanıyorum

export LS_COLORS=$(printf %s    \
    ':*rc=36:*.ini=36:*.inf=36:*.cfg=36:*~=33:*.bak=33:*$=33'   \
    ...
    ':bd=40;33;1:cd=40;33;1:or=1;31:mi=31:ex=00')

Bir dosyada hem benim kaynaklı .bashrcve .zshrc.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.