শেল ভেরিয়েবলের কমান্ডের আউটপুট আমি কীভাবে নির্ধারণ করতে পারি?


76

আমি একটি অভিব্যক্তির ফলাফলটি একটি ভেরিয়েবলের কাছে নির্ধারণ করতে এবং একটি স্ট্রিং দিয়ে এটি যুক্ত করতে চাই, তারপরে এটি প্রতিধ্বনি করুন। আমি যা পেয়েছি তা এখানে:

#!/bin/bash
cd ~/Desktop;
thefile= ls -t -U | grep -m 1 "Screen Shot";
echo "Most recent screenshot is: "$thefile;

কিন্তু যে ফলাফল:

Screen Shot 2011-07-03 at 1.55.43 PM.png
Most recent screenshot is: 

সুতরাং, দেখে মনে হচ্ছে এটি নির্ধারিত হচ্ছে না $thefile, এবং এটি কার্যকর হওয়ার সাথে সাথে মুদ্রিত হচ্ছে।


উত্তর:


108

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

আপনি একটি কমান্ডের আউটপুট ক্যাপচার করতে চান, সুতরাং আপনার কমান্ড প্রতিস্থাপন ব্যবহার করা উচিত :

thefile=$(ls -t -U | grep -m 1 "Screen Shot")

(কিছু সাহিত্য একটি বিকল্প বাক্য গঠন দেখায় thefile=`ls …`; ব্যাককোটের বাক্যবিন্যাসের মাঝে বাকী উদ্ধৃতিগুলি ডলার-প্যারেন্টিস সিনট্যাক্সের সমতুল্য হয়, ব্যাককোটের অভ্যন্তরে উদ্ধৃতিটি মাঝে মাঝে অদ্ভুত থাকে, তাই কেবল ব্যবহার করুন $(…)))

আপনার স্ক্রিপ্ট সম্পর্কে অন্যান্য মন্তব্য:

  • সংযুক্ত -t(সময় অনুসারে বাছাই) সাথে -U(বাছাই করবেন না) বোঝা যায় না; শুধু ব্যবহার -t
  • grepস্ক্রিনশটগুলির সাথে মেলে ব্যবহার করার পরিবর্তে , একটি ওয়াইল্ডকার্ড পাস করা আরও পরিষ্কার lsএবং headপ্রথম ফাইলটি ক্যাপচার করার জন্য:

    thefile=$(ls -t *"Screen Shot"* | head -n 1)
  • এর আউটপুট পার্স করাls সাধারণত একটি খারাপ ধারণা । প্রিন্টেবল অক্ষরগুলির সাথে আপনার ফাইলের নাম থাকলে এটি বেশ খারাপভাবে ব্যর্থ হতে পারে। তবে, তারিখ অনুসারে ফাইলগুলি বাছাই করা কঠিন ls, সুতরাং যদি আপনি জানেন যে ফাইলের নামে আপনার হাতে ছাপানো অক্ষর বা ব্যাকস্ল্যাশ নেই an

  • চলক বিকল্পের চারপাশে সর্বদা ডাবল উদ্ধৃতি ব্যবহার করুন , এখানে এখানে লিখুন

    echo "Most recent screenshot is: $thefile"

    ডাবল উক্তি ব্যতীত ভেরিয়েবলের মান পুনরায় ছড়িয়ে দেওয়া হয়, এতে যদি সাদা জায়গা বা অন্যান্য বিশেষ অক্ষর থাকে তবে সমস্যা দেখা দেয়।

  • কোনও রেখার শেষে আপনার অর্ধিকোলনের দরকার নেই। এগুলি অনর্থক তবে ক্ষতিহীন।
  • শেল স্ক্রিপ্টে এটি অন্তর্ভুক্ত করা প্রায়শই ভাল ধারণা set -e। এটি শেলটিকে কোনও কমান্ড ব্যর্থ হলে (ননজারো স্থিতি ফিরিয়ে দিয়ে) প্রস্থান করতে বলেছে।

আপনি গনুহ এটি আছে (বিশেষ করে যদি আপনি অ এমবেডেড লিনাক্স বা Cygwin চালাচ্ছেন), তাহলে সাম্প্রতিকতম ফাইল খোঁজার আরেকটি পদ্ধতির আছে: আছে findফাইল এবং তাদের তারিখগুলি তালিকা, এবং ব্যবহার sortএবং tailকনিষ্ঠ ফাইল Extract করুন।

thefile=$(find -maxdepth 1 -type f -name "*Screen Shot*" -printf "%T@ %p" |
          sort -k 1n | tail -n 1)

আপনি যদি এই স্ক্রিপ্টটি বাশের পরিবর্তে zsh এ লিখতে ইচ্ছুক হন তবে নতুন ফাইলটি ধরার আরও সহজ উপায় আছে, কারণ zsh এর কাছে গ্লোব কোয়ালিফায়ার রয়েছে যা ওয়াইল্ডকার্ডকে কেবল নামেই নয়, ফাইল মেটাটাটাতেও মেলানোর অনুমতি দেয়। (om[1])প্যাটার্ন পর অংশ উল্লিখিত glob কোয়ালিফায়ার হয়; omবয়সের বৃদ্ধির মাধ্যমে ম্যাচগুলি বাছাই করে (অর্থাত্ পরিবর্তনের সময়, নতুন প্রথম) এবং [1]কেবল প্রথম ম্যাচটি বের করে। পুরো ম্যাচটি বন্ধনীতে হওয়া দরকার কারণ এটি প্রযুক্তিগতভাবে একটি অ্যারে, যেহেতু গ্লোব্বিং ফাইলগুলির একটি তালিকা ফিরিয়ে দেয়, এমনকি যদি [1]এই নির্দিষ্ট ক্ষেত্রে তালিকার একটি ফাইল থাকে (সর্বাধিক)।

#!/bin/zsh
set -e
cd ~/Desktop
thefile=(*"Screen Shot"*(om[1]))
echo "Most recent screenshot is: $thefile"

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

3
এটাই আমি বলব যথার্থ উত্তর! :)
অ্যালেক্স

4

আপনি যদি মাল্টলাইন / একাধিক কমান্ড / গুলি দিয়ে এটি করতে চান তবে আপনি এটি করতে পারেন:

output=$( bash <<EOF
#multiline/multiple command/s
EOF
)

বা:

output=$(
#multiline/multiple command/s
)

উদাহরণ:

#!/bin/bash
output="$( bash <<EOF
echo first
echo second
echo third
EOF
)"
echo "$output"

আউটপুট:

first
second
third

এটি একটি দুর্দান্ত উত্তর। কমান্ডের অংশ হিসাবে আমি কোনও ভেরিয়েবল নির্দিষ্ট করতে পারি? উদাহরণস্বরূপoutput=$(echo $someVariable)
জ্যাচ স্মিথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.