মাল্টি-লাইন শেল ভেরিয়েবল কীভাবে নির্দিষ্ট করবেন?


122

আমি একটি প্রশ্ন লিখেছি:

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

স্থানীয় স্কয়ার - একটি খুব দীর্ঘ স্ট্রিং। অনুসন্ধান বিন্যাস করা হয় না। আমি কীভাবে একটি স্ট্রিংকে একাধিক লাইনে বিভক্ত করতে পারি?


4
shellএখানে কি ভাল কথা বলছেন? করা উচিত batchহবে bashঅথবা আপনি darkside থেকে সত্যিই আছেন?
ক্রিস সিমুর

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একটি নতুন লাইনের মুখোমুখি হওয়ার সময় পড়া বন্ধ না করার কথা।
সাইকেল

170

প্রয়োজনে কেবল নতুন লাইন sertোকান

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

শেলটি সমাপ্ত উদ্ধৃতি চিহ্নটির সন্ধান করবে


7
স্কেল ক্যোয়ারিতে ডাবল-কোটস থাকলে ভাল সমাধান নয়। আপনাকে তাদের পালাতে হবে এবং এটি অগোছালো হয়ে যাবে।
ডগবনে

13
@ ডগবনে ডাবলকোটগুলি বেশিরভাগ এসকিউএল উপভাষায় খুব কমই উপস্থিত হয়, তাই অনুশীলনে এটি পরিষ্কার।
আইয়েন স্যামুয়েল ম্যাকলিন বয়স্ক

4
তারপরে একক উদ্ধৃতিতে স্ট্রিং মোড়ানো।
ট্রিপলি

আপনি কেন নেতৃত্বের শীর্ষস্থানীয় ব্রেকটি চান বা প্রয়োজন তা নিশ্চিত নন। আমার আবেদনের জন্য আমি তা করি নি আমি সবে শুরু করেছিsql="SELECT c2, c2
bhfailor

1
মজার বিষয় এটি সত্য বলা খুব সহজ বলে মনে হচ্ছে। অবগতির জন্য, DQ যোগ করার জন্য, শুধু একটি পরিবর্তনশীল DQ তৈরি = '\ "' এবং তারপর বিবৃতিতে এটা উল্লেখ $ {DQ} সাথে।
টিমোথি সি কুইন

69

আমি একটি অতিরিক্ত উত্তর দিতে চাই, অন্যটি বেশিরভাগ ক্ষেত্রেই যথেষ্ট।

আমি একাধিক লাইনের উপর একটি স্ট্রিং লিখতে চেয়েছিলাম, তবে এর বিষয়বস্তুগুলি একক-লাইন হওয়া দরকার।

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

আমি যদি দুঃখিত এটি যদি কিছুটা অফ-টপিক হয় (এসকিউএল এর জন্য আমার এটির দরকার ছিল না)। তবে মাল্টি-লাইন শেল ভেরিয়েবলগুলি অনুসন্ধান করার সময় এই পোস্টটি প্রথম ফলাফলগুলির মধ্যে আসে এবং একটি অতিরিক্ত উত্তর উপযুক্ত বলে মনে হয়।


1
এমনকি s গুলি ছাড়া আমার লিখিত সামগ্রী এক লাইনে বেরিয়ে আসছে।
পেপিরো

12
@ পেপিরো, echo "$sql"পরিবর্তে চেষ্টা করুন echo $sql
মাইকেল

@ মিশেলমোল - আমার প্রথম লিনাক্স ইনস্টল হওয়ার প্রায় দুই দশক পরে এবং আমি এখনও নতুন কিছু শিখছি। এই "কৌশল" জন্য ধন্যবাদ।
শেঠ

6

অনুরূপ প্রশ্নের ডিমো 414 জবাবের জন্য ধন্যবাদ , এটি তার দুর্দান্ত সমাধানটি কীভাবে কাজ করে তা দেখায় এবং দেখায় যে আপনি সহজেই টেক্সটে উদ্ধৃতি এবং ভেরিয়েবলগুলি রাখতে পারেন:

উদাহরণ আউটপুট

$ ./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 '    \
)

আমি স্বীকার করি যে উদ্ধৃতি দেওয়ার প্রয়োজনটি এসকিউএলটির জন্য এটি কুশ্রী করে তোলে, তবে এটি শিরোনামের (আরও সাধারণভাবে প্রকাশিত) প্রশ্নের উত্তর দেয়।

আমি এটি ব্যবহার করি

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এবং .zshrc

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.