ব্যাশ ভেরিয়েবলগুলিতে নতুন লাইন


9

আমি ব্যাশ ভেরিয়েবলে একাধিক লাইন সঞ্চয় করার চেষ্টা করছি, তবে এটি কাজ করবে বলে মনে হচ্ছে না।

উদাহরণস্বরূপ, আমি যদি /binপ্রতি লাইনে একটি ফাইল তালিকাবদ্ধ $LSকরি এবং এটি সঞ্চয় করি তবে আমি $LSস্টিডিন হিসাবে পাস করি wc, এটি সর্বদা 1:

$ ls -1 /bin | wc -l
134
$ LS=$(ls -1 /bin); wc -l <<< $LS
1

আমি যদি স্ক্রিনে আউটপুট দেওয়ার চেষ্টা করি তবে আমি বিভিন্ন ফলাফল পেতে পারি: echoসমস্ত লাইন একক লাইনে printfমুদ্রণ করি , যখন কেবল প্রথম লাইনটি প্রিন্ট করে:

#!/bin/bash
LS=$(ls -1 /bin)
echo $LS
printf $LS

সুতরাং, কোনও ব্যাশ ভেরিয়েবলে একাধিক লাইন থাকতে পারে?

উত্তর:


15

আপনাকে এটিকে দ্বিগুণ করতে হবে (এবং বেশিরভাগ ক্ষেত্রে আপনার উদ্ধৃতি ভেরিয়েবলগুলি দ্বিগুণ করা উচিত ):

echo "$LS"

কিন্তু প্রতিধ্বনি ব্যবহার করবেন না ভেরিয়েবল বিষয়বস্তু মুদ্রণ করতে ব্যবহার পরিবর্তে printf, :

printf '%s\n' "$LS"

1
সামগ্রিক উত্তরের উপর কেবল একটি সূক্ষ্ম বক্তব্য রাখার জন্য: প্রিন্টফ প্রত্যাশা করে যে কোনও ফর্ম্যাট স্ট্রিং এর প্রথম প্যারামিটার হবে, তাই তারা কী প্রত্যাশা করেছিল তা তারা দেখেনি। যদি তারা প্রিন্টফ থেকে আউটপুটে নতুন লাইনগুলি দেখতে চায়, ফাঁকে ফাঁকে ফাঁকে ফাঁকে বিভক্ত হয়, printf "%s\n" $LSএটি করবে it
জেফ শ্যাচলার

% এলএস হতে হবে $ এলএস, বিটিডব্লিউ (আমি এত সংক্ষিপ্ত সম্পাদনা করতে পারিনি)
জেফ শ্যাচলার

ধন্যবাদ! এটি অবশ্যই wcএবং অন্যান্য কমান্ডগুলির সাথেও কাজ করে:wc -l <<< "$LS"
উইজার্ড Jul৯

1
@ জেফ শ্যাচলার: না, আপনি printf '%s\n' "$LS"যদি নতুন লাইন দেখতে চান তবে কেবল এই ক্ষেত্রে আপনার পরিবর্তনশীলটিকে উদ্ধৃত করা উচিত নয় । এটি ভুল টাইপিং, এটি স্থির!
cuonglm

ভেরিয়েবল মুদ্রণের জন্য আপনার ইকো ব্যবহার করা উচিত নয় কেন?
123

9

নতুনলাইনগুলি ভেরিয়েবলের মধ্যে রয়েছে। LS=$(ls -1)চলকটিকে LSআউটপুটে সেট করে ls -1(যা lsআউটপুট কোনও টার্মিনালে যায় কেবল ব্যতীত, একই আউটপুট উত্পাদন করে ), বিয়োগ পিছনে নতুন লাইনে।

সমস্যাটি হ'ল আপনি যখন মানটি মুদ্রণ করবেন তখন আপনি নিউলাইনগুলি সরিয়ে ফেলছেন। শেল স্ক্রিপ্টে, $LS"ভেরিয়েবলের মান" বলতে বোঝায় না, এর অর্থ "এর মানটি LSগ্রহণ করুন LS, অনুযায়ী শব্দগুলিতে বিভক্ত করুন IFSএবং প্রতিটি শব্দকে গ্লোব প্যাটার্ন হিসাবে ব্যাখ্যা করুন"। এর মান পেতে আপনার LSলিখতে হবে "$LS", বা আরও সাধারণত $LSডাবল উদ্ধৃতিগুলির মধ্যে রাখতে হবে।

echo "$LS"LSব্যাকস্ল্যাশ অক্ষর ব্যাখ্যা করে এমন কয়েকটি শেল ছাড়া এবং এর সাথে শুরু হওয়া কয়েকটি মান ব্যতীত এর মান মুদ্রণ করে -

printf "$LS"LSযতক্ষণ না এতে কোনও শতাংশ বা ব্যাকস্ল্যাশ অক্ষর থাকে এবং (বেশিরভাগ বাস্তবায়ন সহ) শুরু হয় না ততক্ষণ এর মান মুদ্রণ করে -

LSঠিক এর মান মুদ্রণ করতে , ব্যবহার করুন printf %s "$LS"। আপনি যদি শেষে একটি নতুন লাইন চান তবে ব্যবহার করুন printf '%s\n' "$LS"

দ্রষ্টব্য যে $(ls), সাধারণভাবে, বর্তমান ডিরেক্টরিতে ফাইলগুলির তালিকা নয়। এটি কেবল তখনই কাজ করে যখন আপনার পর্যাপ্ত ফাইল নাম থাকবে। (ডট ফাইল ছাড়া) ফাইলের নাম তালিকা পেতে, আপনি একটি ওয়াইল্ডকার্ড ব্যবহার করা প্রয়োজন: *। ফলাফলটি স্ট্রিং নয়, স্ট্রিংগুলির তালিকা, সুতরাং আপনি এটিকে স্ট্রিং ভেরিয়েবলের জন্য বরাদ্দ করতে পারবেন না; আপনি files=(*)শেলগুলিতে একটি অ্যারে ভেরিয়েবল ব্যবহার করতে পারেন যা তাদের সমর্থন করে (ksh93, bash, zsh)।

আরও তথ্যের জন্য, দেখুন কেন আমার শেল স্ক্রিপ্টটি সাদা স্থান বা অন্যান্য বিশেষ অক্ষরগুলিতে চেপে যায়?


প্রিন্টফ "$ এলএস" ব্যাকস্ল্যাশ চরিত্রের
পার্সিংয়েরও মুখোমুখি হবে

0

উপরোক্ত

printf '%s\n' "$LS"

একমাত্র সঠিক সমাধান।

আমি প্রমাণ করতে পারি যে অন্যান্য প্রস্তাবিত সমাধানগুলি কেবল echoএবং printfসঠিকভাবে কাজ করে না:

$ mkdir t
$ cd t
$ touch \\n
$ LS=$(ls -l)
$ echo "$LS"
total 0
-rw-r--r--  1 domain  domain  0 Nov  5 06:12

$ printf "$LS\n"
total 0
-rw-r--r--  1 domain  domain  0 Nov  5 06:12

$ printf '%s\n' "$LS"
total 0
-rw-r--r--  1 domain  domain  0 Nov  5 06:12 \n
$ ls -l
total 0
-rw-r--r--  1 domain  domain  0 Nov  5 06:12 \n
$ rm \\n
$ cd ..
$ rmdir t
$

(যে কেউ এর সাথে V=$(printf 'line0:\\n\\n\nline1.\n') printf '%s\n' "$V"বিভিন্নতা এবং বিভিন্নতা পরীক্ষা করতে পারে ))

যেখানে \nফাইলের নামগুলি সাধারণ নাও হতে পারে, git diffএকটি ভেরিয়েবলের মধ্যে সংরক্ষণ করুন এবং আপনার আক্ষরিকভাবে \nনাটকীয়ভাবে বৃদ্ধি পাওয়ার সম্ভাবনা রয়েছে ।


লক্ষ্য করুন kshএবং zshএছাড়াও সমর্থন print -r -- "$LS"এবং zshএছাড়াও আছে echo -E - $LScshহয়েছে echo $LS:qযদি $ ls খালি, এবং প্রথম স্থানে $ ls মধ্যে একটি একাধিক লাইন ভ্যালু পাচ্ছি csh শেল বেশ চতুর যদিও যে আউটপুট newline অক্ষর আছে।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.