मल्टी-लाइन शेल चर कैसे निर्दिष्ट करें?


122

मैंने एक प्रश्न लिखा है:

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

स्थानीय sql - एक बहुत लंबी स्ट्रिंग। क्वेरी स्वरूपित नहीं है। मैं एक स्ट्रिंग को कई लाइनों में कैसे विभाजित कर सकता हूं?


4
आप shellयहाँ क्या बात कर रहे हैं? होना batchचाहिए bashया आप वास्तव में अंधेरे से हैं?
क्रिस सेमोर

1
यदि यह शेल / बैश है, तो आपको =रिक्त स्थान से घिरा नहीं होना चाहिए ।
निक ओ ली

जवाबों:


138

readनीचे दिखाए गए अनुसार एक हेरेडोक का उपयोग करें :

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

echo "$sql"

52
ध्यान दें कि readइस स्थिति में 1 का निकास कोड होगा; अगर यह बात (आप set -eउदाहरण के लिए साथ चल रहे हैं ), तो आप || trueपहली पंक्ति के अंत में जोड़ना चाहेंगे ।
चेपनर

4
set -eशेल से बाहर निकलता है अगर कमांड में "गैर-शून्य" गैर-शून्य निकास स्थिति है। "अप्रत्याशित" से मेरा मतलब है कि यह एक ऐसे संदर्भ में चलता है जहाँ आप विशेष रूप से इसके निकास की स्थिति को नहीं देख रहे हैं। falseउदाहरण के लिए, शेल से बाहर निकल जाएगा। false || trueयदि आप पहली बार विफल होने पर दूसरी कमांड को चलाने के लिए निर्दिष्ट करके गैर-शून्य निकास स्थिति की आशंका कर रहे हैं, तो नहीं।
शेपनर

1
सेट-ई और रीड (अंतिम अभ्यास देखें) के साथ समस्या का विस्तार से वर्णन यहाँ किया गया है: mywiki.wooledge.org/BashFAQ/105
पीटर

5
-d ' 'यहाँ क्या करता है?
hg_git

3
@hg_git readएक नई पंक्ति का सामना करते समय पढ़ना बंद नहीं करने के लिए कह रहा है ।
साइकर

171

जहाँ आवश्यक हो बस नई लाइन डालें

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

शेल समापन उद्धरण चिह्न की तलाश में होगा


7
एक अच्छा समाधान नहीं है यदि sql क्वेरी में दोहरे उद्धरण हों। आपको उनसे बचना होगा और यह गड़बड़ हो जाएगा।
dogbane

13
अधिकांश SQL बोलियों में @dogbane डबलक्वेय शायद ही कभी दिखाई देते हैं, इसलिए व्यवहार में यह साफ है।
इयान सैमुअल मैकलीन एल्डर

4
फिर स्ट्रिंग को सिंगल कोट्स में लपेटें।
ट्रिपलए

निश्चित नहीं है कि आप क्यों चाहते हैं या अग्रणी लाइन ब्रेक की आवश्यकता है। मेरे आवेदन के लिए मैंने ऐसा नहीं किया था मैंने अभी शुरू कियाsql="SELECT c2, c2
bhfailor

1
मजेदार है कि यह सच होना बहुत आसान लगता है। FYI करें, DQ जोड़ने के लिए, बस एक वैरिएबल DQ = '\ "बनाएं और फिर $ D DQ} के साथ स्टेटमेंट में इसका संदर्भ लें।
टिमोथी सी। क्विन

69

मैं एक अतिरिक्त जवाब देना चाहूंगा, जबकि दूसरे ज्यादातर मामलों में पर्याप्त होंगे।

मैं कई लाइनों पर एक स्ट्रिंग लिखना चाहता था, लेकिन इसकी सामग्री को एकल-पंक्ति होने की आवश्यकता थी।

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

मुझे खेद है अगर यह थोड़ा ऑफ-टॉपिक (मुझे SQL के लिए इसकी आवश्यकता नहीं थी)। हालाँकि, यह पोस्ट मल्टी-लाइन शेल चर के लिए खोज करते समय पहले परिणामों के बीच आता है और एक अतिरिक्त उत्तर उपयुक्त लगा।


1
यहां तक ​​कि बिना मेरी सामग्री एक लाइन पर आ रहा है।
पैपीरो

12
@ पपीरो, echo "$sql"इसके बजाय प्रयास करें echo $sql
माइकल मोल

@MichaelMol - मेरा पहला लिनक्स स्थापित होने के लगभग दो दशक बाद और मैं अभी भी कुछ नया सीख रहा हूं। इस "ट्रिक" के लिए धन्यवाद।
सेठ

6

इसी तरह के प्रश्न के लिए dimo414 के उत्तर के लिए धन्यवाद , यह दिखाता है कि उसका महान समाधान कैसे काम करता है, और दिखाता है कि आपके पास पाठ में उद्धरण और चर भी आसानी से हो सकते हैं:

उदाहरण आउटपुट

$ ./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

readचर का निर्यात नहीं करता है (जो कि ज्यादातर समय एक अच्छी बात है)। यहां एक विकल्प है जिसे एक कमांड में निर्यात किया जा सकता है, लाइनफीड को संरक्षित या त्याग कर सकता है, और आवश्यकतानुसार उद्धरण-शैलियों के मिश्रण की अनुमति देता है। बाश और zsh के लिए काम करता है।

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

मैं यह उद्धृत करने की आवश्यकता को स्वीकार करता हूं कि यह SQL के लिए बदसूरत है, लेकिन यह शीर्षक में (अधिक सामान्यतः व्यक्त) प्रश्न का उत्तर देता है।

मैं इसे इस तरह से उपयोग करता हूं

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')

एक फ़ाइल में मेरे .bashrcऔर दोनों से sourced .zshrc

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.