বাশে উদ্ধৃত স্ট্রিংয়ের মধ্যে কীভাবে পরিবেশের পরিবর্তনশীলটি ব্যবহার করতে হয়


95

আমি বাশ স্ক্রিপ্টে নিম্নলিখিতগুলির বিভিন্ন রূপ চেষ্টা করেছি:

#!/bin/bash
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

তবে COLUMNSপরিবেশের ভেরিয়েবলটি সঠিকভাবে প্রসারিত করতে সিনট্যাক্সটি পাচ্ছি না ।

আমি নিম্নলিখিত বিভিন্ন ফর্ম চেষ্টা করেছি:

svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W $COLUMNS'

এবং

svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W ${COLUMNS}'

এবং

eval svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

পরামর্শ?


সুতরাং উদাহরণস্বরূপ আপনার ক্ষেত্রে কি উত্পাদন করে? এবং আপনি তাদের উত্পাদন করতে চান?

স্ক্রিপ্টের বাইরের কমান্ড কাজ করছে?
ডিএফএ

আপনি চেষ্টা করেছেনsvn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W ""$COLUMNS"
কিয়ান চেন

$@বিটিডব্লিউ , অব্যক্ত ব্যবহার করে একেবারে একইরকম করে তোলে $*- যা এটি "foo bar"দুটি পৃথক যুক্তির বিভক্ত হয়ে যায় fooএবং bar। যদি আপনি মূল আর্গুমেন্ট তালিকাটি আপনাকে যেমন দেওয়া হয়েছিল ঠিক তেমন সংরক্ষণ করতে চান তবে আপনি চান "$@"
চার্লস ডাফি

উত্তর:


16

যদি অনিশ্চিত হয়ে থাকে তবে আপনি টার্মিনালে 'কলস' অনুরোধটি ব্যবহার করতে পারেন এবং COLUMNS ভুলে যেতে পারেন:

COLS=$(tput cols)

যে কারণেই হোক না কেন, এটিই আমি সমাধান করতে সক্ষম হয়েছি (11 / মে 10:38 ইটি হিসাবে) page ধন্যবাদ
জেমি

407

শিরোনামে জিজ্ঞাসা করা সাধারণ প্রশ্নের উত্তর খুঁজতে (যেমনটি আমি ছিলাম) গুগলের মাধ্যমে যারা এখানে এসেছেন তাদের জন্য কেবল একটি দ্রুত নোট / সংক্ষিপ্তসার। কোটগুলির ভিতরে শেল ভেরিয়েবলের অ্যাক্সেস পাওয়ার জন্য নিম্নলিখিত যে কোনওটির কাজ করা উচিত:

echo "$VARIABLE"
echo "${VARIABLE}"

একক উদ্ধৃতি ব্যবহার প্রধান সমস্যা। বাশ রেফারেন্স ম্যানুয়াল অনুসারে :

একক উদ্ধৃতিতে অক্ষরগুলি আবদ্ধ করা ( ') উদ্ধৃতিগুলির মধ্যে প্রতিটি অক্ষরের আক্ষরিক মান সংরক্ষণ করে। ব্যাকস্ল্যাশ এর আগেও, একক উদ্ধৃতিগুলির মধ্যে একক উদ্ধৃতি নাও উপস্থিত হতে পারে। [...] উদ্ধৃতি চিহ্ন মধ্যে আবদ্ধ অক্ষর ( ") বাদ দিয়ে কোট মধ্যে সব অক্ষরের আক্ষরিক মান অপরিবর্তিত, $, `, \, এবং, যখন ইতিহাস সম্প্রসারণ সক্ষম হলে, !। অক্ষর $এবং double ডাবল উদ্ধৃতিগুলির মধ্যে তাদের বিশেষ অর্থ ধরে রাখে (শেল বিস্তৃতি দেখুন)। যখন নিম্নলিখিত অক্ষরগুলি এক দ্বারা অনুসৃত ব্যাকস্ল্যাশ শুধুমাত্র তার বিশেষ অর্থ বজায়: $, `, ",\, বা নিউলাইন। ডাবল উদ্ধৃতিগুলির মধ্যে, এই অক্ষরের একটি অনুসরণ করা ব্যাকস্ল্যাশগুলি সরানো হবে। বিশেষ অর্থ ব্যতীত পূর্ববর্তী অক্ষরগুলি ব্যাকস্ল্যাশগুলি অবিস্মরণীয় রেখে দেওয়া হয়েছে। একটি ডাবল উদ্ধৃতি এটি একটি ব্যাকস্ল্যাশ সঙ্গে পূর্ববর্তী দ্বারা ডাবল উদ্ধৃতি মধ্যে উদ্ধৃত করা যেতে পারে। যদি সক্ষম করা থাকে তবে !ডাবল উদ্ধৃতিতে উপস্থিত কোনও ব্যাকস্ল্যাশ ব্যবহার করে এড়িয়ে যাওয়া অবধি ইতিহাসের সম্প্রসারণ করা হবে । এর আগের ব্যাকস্ল্যাশ !সরানো হয়নি। বিশেষ পরামিতি *এবং @যখন উদ্ধৃতি চিহ্ন মধ্যে (শেল প্যারামিটার সম্প্রসারণ দেখুন) বিশেষ অর্থ আছে।

প্রশ্নে জিজ্ঞাসা করা নির্দিষ্ট ক্ষেত্রে, OL COLUMNS একটি বিশেষ পরিবর্তনশীল যাতে নন-মানসম্পন্ন বৈশিষ্ট্য রয়েছে (উপরে লুনাথের উত্তর দেখুন)।


20
একক উদ্ধৃতি ক্ষেত্রে, হয়তো এই কার্যসংক্রান্ত সাহায্য করে: 'before'"$variable"'after'(এই উত্তরে বলেন: stackoverflow.com/a/13802438/2254346 )
MakisH

দুর্দান্ত উত্তর! আমার একক উক্তিগুলির মধ্যে আমার এনভেরি ভেরিয়েবলটি উল্লেখ করার একই সমস্যা ছিল। একবার আমি আমার একক উক্তিটি ডাবল উদ্ধৃতিতে পরিবর্তিত হয়ে গেলে, আমার এনভেরি ভেরিয়েবলটি প্রত্যাশা অনুযায়ী প্রসারিত হচ্ছিল।
বিনিতা ভারতী

14

নোটটি COLUMNSহ'ল:

  1. না একটি পরিবেশ পরিবর্তনশীল। এটি একটি সাধারণ বাশ প্যারামিটার যা ব্যাশ নিজেই সেট করে।
  2. একটি SIGWINCHসংকেত প্রাপ্তির পরে স্বয়ংক্রিয়ভাবে সেট করুন ।

দ্বিতীয় দফা সাধারণত এর অর্থ হল আপনার COLUMNSপরিবর্তনশীল শুধুমাত্র আপনার সেট করা হবে ইন্টারেক্টিভ , শেল না একটি ব্যাশ স্ক্রিপ্টের মধ্যে।

যদি আপনার স্ক্রিপ্টটি stdinআপনার টার্মিনালের সাথে সংযুক্ত থাকে তবে আপনি নিজের টার্মিনালটিকে ম্যানুয়ালি জিজ্ঞাসা করে আপনার টার্মিনালের প্রস্থটি সন্ধান করতে পারেন:

tput cols

এবং এটি আপনার এসভিএন কমান্ডে ব্যবহার করতে:

svn diff "$@" --diff-cmd /usr/bin/diff -x "-y -w -p -W $(tput cols)"

(দ্রষ্টব্য: আপনার উদ্ধৃতি দেওয়া উচিত "$@"এবং eval;-) থেকে দূরে থাকা উচিত )


তথ্যের জন্য ধন্যবাদ; কী হচ্ছে তা জানার ফলে ইস্যুতে ক্যাথারসিসের ধারণা পাওয়া যায়।
জেমি

2

নিম্নলিখিত স্ক্রিপ্টটি একাধিক মানের জন্য আমার জন্য কাজ করে $COLUMNS। আমি ভাবছি আপনি যদি COLUMNSএই কলটির আগে সেট না করে থাকেন ?

#!/bin/bash
COLUMNS=30
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

$COLUMNSআপনার স্ক্রিপ্টের ভিতরে এটি সঠিকভাবে সেট হয়েছে কিনা তা প্রতিধ্বনি করতে পারেন?


বু, হিস রে: অকেজো $@- যা একটি একক প্যারামিটারকে "two words"দুটি পৃথক পৃথক পরামিতিতে বিভক্ত করে twoএবং words"$@"আর্গুমেন্ট তালিকাটি যেমনটি দেওয়া হয়েছিল ঠিক তেমনটি পাস করা উচিত ।
চার্লস ডাফি

0

আপনি এটি ঠিকঠাক করছেন, সুতরাং আমি অনুমান করি যে অন্য কোনও কিছু ভুল হয়েছে (COLUMNS রফতানি নয়?)।

এই কেসগুলি ডিবাগ করার কৌশলটি একটি বিশেষায়িত কমান্ড করা (প্রোগ্রামিং ল্যাঙ্গুয়েজ লোকদের জন্য বন্ধ)। ডিফ-কলামগুলির নামে একটি শেল স্ক্রিপ্ট তৈরি করুন:

exec /usr/bin/diff -x -y -w -p -W "$COLUMNS" "$@"

এবং শুধু ব্যবহার

svn diff "$@" --diff-cmd  diff-columns

এইভাবে আপনার কোডটি পড়ার জন্য আরও পরিষ্কার এবং আরও বেশি মডুলার (শীর্ষ-নীচের পদ্ধতির), এবং আপনি পৃথক-কলামগুলির কোডটি পৃথকভাবে পৃথকভাবে পরীক্ষা করতে পারবেন (নীচে-আপ পদ্ধতির)।


প্রক্রিয়াটি কাঁটাচালিত হওয়ার আগে কমান্ডলাইনটি পার্স করা হয়েছে, সুতরাং COLUMNS রফতানি না করা সমস্যা হতে পারে না।
পিটার ভ্যান ডের হাইজডেন

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