আমি STDIN থেকে ভেরিয়েবলে একাধিক লাইন কীভাবে পড়ব?


24

আমি কোনও প্রশ্নই করতে পারছি না এই প্রশ্নটি। আমি এখানে কর্মক্ষেত্রে একটি বিল্ড প্রক্রিয়া স্বয়ংক্রিয় করছি এবং আমি যা করার চেষ্টা করছি তা হ'ল সংস্করণ নম্বর এবং বিল্ডটির একটি ছোট বিবরণ যা বহু-লাইন হতে পারে get যে সিস্টেমে এটি চালিত হয় তা হ'ল OSX 10.6.8 .8

আমি ক্যাট ব্যবহার থেকে শুরু করে প্রতিটি লাইনের প্রক্রিয়াকরণ পর্যন্ত প্রয়োজনীয় সবকিছু দেখেছি। আমার কী ব্যবহার করা উচিত এবং কেন তা বুঝতে পারি না।

প্রচেষ্টা

read -d '' versionNotes

ব্যবহারকারীকে ব্যাকস্পেস কী ব্যবহার করতে হলে গার্ডযুক্ত ইনপুট ফলাফল Results এছাড়াও ইনপুটটি শেষ করার ভাল উপায় নেই কারণ ^ ডি শেষ হয় না এবং ^ সি কেবল প্রক্রিয়াটি থেকে বেরিয়ে আসে।

read -d 'END' versionNotes

কাজ করে ... তবে ব্যাকস্পেস কী প্রয়োজন হলে এখনও ইনপুটটি গারবেল করে।

while read versionNotes
do
  echo "  $versionNotes" >> "source/application.yml"
done

ইনপুটটি সঠিকভাবে শেষ করে না (কারণ খালি স্ট্রিংয়ের সাথে ম্যাচটি করতে আমার অনেক দেরি হয়ে গেছে)।


আপনি সঠিক ব্যবহারকারীর কাছ থেকে এই তথ্য পাচ্ছেন?
গ্লেন জ্যাকম্যান

সঠিক; আমি চাই যে স্ক্রিপ্টটি কার্যকর করার সময় ব্যবহারকারী টার্মিনালে এই তথ্যটি প্রবেশ করান।
রবার্ট কে

1
আপনি নিজেকে পরিষ্কার করেননি, বরং বলব।
পোয়েজ

উত্তর:


20

man bash উল্লেখ «…

কমান্ড প্রতিস্থাপন $ (বিড়াল ফাইল) সমতুল্য কিন্তু দ্রুত $ (<ফাইল) দ্বারা প্রতিস্থাপন করা যেতে পারে।

... »

$ myVar=$(</dev/stdin)
hello
this is test
$ echo $myVar
hello this is test
$ echo "$myVar"
hello
this is test

এবং আমি সম্মত হই যে এটি উল্লেখযোগ্য - echo "$myVar"এটি প্রদত্ত হিসাবে ইনপুটটি প্রদর্শন করবে।


1
মাল্টলাইন ইনপুট পরে কিভাবে থামবেন? আমি সিটিআরএল সি টিপলে এটি বন্ধ হয়ে যায় তবে ভেরিয়েবলটি সংরক্ষিত হয় না!
নিখিল

2
ইউনিক্স টার্মিনাল "শৃঙ্খলা" আছে: en.wikipedia.org/wiki/Line_discipline • এটি চাপলে কি হবে "ফাইলের শেষে" গড় • চেক করবেন পড়া man stty, বর্তমান সেটিংস পেতে কিভাবে জানতে
poige

2
থামাতে ctrl-d।
freb

9

এটা চেষ্টা কর:

user@host:~$ read -d '' x <<EOF
> mic
> check
> one
> two
> EOF

লাইন ব্রেক ছাড়াই :

user@host:~$ echo $x
mic check one two

সঙ্গে লাইন ব্রেক:

user@host:~$ echo "$x"
mic
check
one
two

2
-d ''আমার যা প্রয়োজন তা হ'ল ধন্যবাদ
ব্রুনো ব্রোনোস্কি

@ ব্রুনো আমার আনন্দ; এটা একটা মুশকিল। বিশেষত প্রথম নজরে, এটি মোটামুটি স্ট্যান্ডার্ড দেখাচ্ছে। যদিও আপনি বিভিন্ন আইডিয়াসনক্র্যাসির হ্যাং পান তবে তা বেশ কার্যকর হতে পারে।
ভয়েসগুলি

8

চমৎকার বাশ গাইড দেখুন সব আপনার ব্যাশ স্ক্রিপ্টিং প্রয়োজনের জন্য।

বিশেষত বাশ এফএকিউতে এটি # 1 নম্বরে রয়েছে:

আমি কীভাবে কোনও ফাইল (ডেটা স্ট্রিম, ভেরিয়েবল) লাইন বাই লাইন (এবং / অথবা ক্ষেত্রের বাইরের ক্ষেত্র) পড়তে পারি?


আপনি ব্যবহার করতে বলছেন read -r, তবে এসটিডিএন থেকে এটি কীভাবে করব? আমি read -rপ্রথম দিকে ব্যবহার করার চেষ্টা করেছি ।
রবার্ট কে

এটি স্ট্যান্ডিন থেকে ডিফল্টরূপে পড়ে।
অ্যাডাপ্টর

2

আমি খালি লাইন না আসা পর্যন্ত প্রতিটি লাইনের সাথে ডিল করে এই সমস্যাটি সমাধান করেছি। এটি আমার পরিস্থিতির জন্য যথেষ্ট ভাল কাজ করে। তবে কেউ যদি আরও ভাল সমাধান যুক্ত করতে চান তবে তা নির্দ্বিধায় করুন।

echo "---
notes: |" > 'version.yml'

while read line
do
  # break if the line is empty
  [ -z "$line" ] && break
  echo "  $line" >> "source/application.yml"
done

read -rপরিবর্তে ব্যবহার করুন।
অ্যাডাপ্ট্র

2

আপনি ভিএম, পিকো এর মতো সম্পাদক শুরু করতে পারেন ...

${VISUAL:-${EDITOR:-vi}} source/application.yml

উম ... কীভাবে কোনওভাবেই ওপি'র প্রশ্নের উত্তর দেয়?
অ্যাডাপ্ট্র

তিনি সম্পাদনাটি স্ক্রিপ্ট থেকে শুরু করতে পারেন।
মিরেসিয়া ভুটকোভিচি

এবং যে সাধন করে, ঠিক কি? তিনি টেক্সট ব্যবহার করতে চায় থেকে লিপিতে একটি ফাইল, লেখ তথ্য থেকে একটি ফাইল।
অ্যাডাপ্ট্র

তিনি ব্যবহারকারীর কাছ থেকে পাঠ্য পড়তে এবং কোনও ফাইলে লিখতে নারাজ। প্রশ্নে যুক্ত মন্তব্যগুলি পড়ুন।
মিরসিয়া ভুটকোভিচি

1

প্রথমে কয়েকটি সংশোধন:

  1. -eরেডলাইন ব্যবহার করে এমন রেখা ব্যবহারে "সংস্করণ" অনুমোদিত করার জন্য (যাতে আপনার বাশ ইতিহাস এবং সমস্ত সম্পাদনা বৈশিষ্ট্য রয়েছে)
  2. -dকেবল একটি চরিত্র লাগে। উদাহরণস্বরূপ 'এন্ড' থেকে 'ই' লাগে এবং ব্যবহারকারী যখনই 'ই' লেখেন তখন পড়া বন্ধ হয়ে যায় (আমার ধারণা এটি আপনি চান না ...)

এটি করার কয়েকটি সম্ভাবনা রয়েছে। আমি লাইনে পাঠ্য লাইনে যাব এবং একটি খালি লাইন পাওয়া গেলে থামব (যদিও আপনি কোনও স্টপ শব্দ সেট করতে পারেন):

unset tmp
while :
do 
 read line
 [[ $line == "" ]] && tmp="${tmp:0:$((${#tmp}-1))}" && break
 tmp="$tmp"$line$'\n'
done

0

আপনার বেশ কয়েকটি পদ্ধতি রয়েছে।

অন্যতম সহজ পদ্ধতি হ'ল:

MYVAR=$(yourcommand)
echo $"MYVAR"

উদাহরণ স্বরূপ:

MYVAR=$(ls /)
echo $"MYVAR"

আমি বাদে এলএস এর মতো শেল কমান্ড চালাচ্ছি না। আমি ব্যবহারকারীর কাছ থেকে মাল্টি-লাইন ইনপুট অনুরোধ করছি।
রবার্ট কে

এটি খুব খারাপ অভ্যাস; আউটপুট প্রক্রিয়া না ls!
অ্যাডাপ্ট্র

@ অ্যাডাপ্ট্রি আমরা এর আগে সব শুনেছি, দয়া করে কোনও ভাল বিকল্পের পরামর্শ দেওয়ার কথা মনে করবেন?
ভয়েসগুলি

0

আমরা বিরতিতে xargs এবং ctrl-d ব্যবহার করে একটি কনস্ট্রাক্ট ব্যবহার করছি। আমি এটির সাথে পুরোপুরি সন্তুষ্ট নই, তবে এটি অবশ্যই বহু-লাইন ব্যবহারকারী ইনপুট নেওয়ার এবং এটিকে ভেরিয়েবলের (স্ট্র্যাটিং অক্ষত) রাখার কাজটি করে। (প্রথম এবং তৃতীয় অ্যাসাইনমেন্টগুলি xargs ইনপুটটির সামগ্রীর চারপাশে উদ্ধৃতি যুক্ত করে))

    printf "\\033[1mWhen finished hit ctrl-d on a new line to proceed.\\033[0m  \\n\\n" 
    # this will load the user's input into a variable instead of a file 
    reminderBody="\"" 
    reminderBody+=$( xargs -0 ) 
    reminderBody+="\"" 

মেইলে (ব্যাশের মাধ্যমে) কোনও ই-মেইল প্রেরণ হওয়ার বিষয় হিসাবে আমরা অনুস্মারককে ব্যবহার করি।


-1

দেখুন: http://tldp.org/LDP/abs/html/intern.html#READR

ব্যবহার করুন readএবং নোট করুন যে আপনি যদি \নতুন লাইনের সাথে কোনও লাইন শেষ করেন তবে তা উপেক্ষা করা হবে। সুতরাং আপনি করতে পারেন:

#! / বিন / ব্যাশ

পড়ুন -p "সংস্করণ:" সংস্করণ
প্রতিধ্বনি $ সংস্করণ

# কিছু ইনপুট প্রবেশ করুন এবং "\" দিয়ে দীর্ঘ লাইন শেষ করুন, তারপরে শেষে সরল প্রবেশ করুন
পড়ুন -p "বিবরণ:" বিবরণ
প্রতিধ্বনি -e "$ সংস্করণ \ n $ বিবরণ >> yourfile.txt

আমি যদি কেবল লাইন ব্রেকগুলি উপেক্ষা করে একটি অনুচ্ছেদ চাইতাম তবে হ্যাঁ। তবে এটি একটি বিল্ড স্ক্রিপ্টের জন্য প্রকাশিত নোটগুলির উত্পন্ন তালিকা হিসাবে, আমার সেই লাইন ব্রেকগুলি সংরক্ষণ করতে সক্ষম হওয়া প্রয়োজন; আমি উদাহরণস্বরূপ বুলেটযুক্ত তালিকা প্রবেশের চেষ্টা করতে পারি।
রবার্ট কে

এবিএস হ'ল ভয়াবহ অনুপাতের একত্ববাদ। এর 90% সম্পূর্ণ ভুল is
অ্যাডাপ্ট্র

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