স্ক্রিপ্টে পরিবর্তনশীল হিসাবে স্পেসগুলির সাথে তারিখ আউটপুট কীভাবে বিন্যাস করবেন?


13

আমি dateএই মত সুন্দর ফর্ম্যাটিং দিয়ে কমান্ডটি করতে চাই:

$ date +"%Y-%m-%d %H:%M:%S"
2015-09-17 16:51:58

তবে আমি এটিকে ভেরিয়েবলে সংরক্ষণ করতে চাই, তাই আমি স্ক্রিপ্ট থেকে এইভাবে কল করতে পারি: echo "$(nice_date) [WARNING] etc etc"

যাইহোক, এটা কাজ করে না

$ nice_date="date +%Y-%m-%d %H:%M:%S"
$ echo "$($nice_date)"
date: extra operand ‘%H:%M:%S
Try 'date --help' for more information.

$ nice_date="date +\"%Y-%m-%d %H:%M:%S\""
$ echo "$($nice_date)"
date: extra operand ‘%H:%M:%S"’
Try 'date --help' for more information.

$ nice_date='date +"%Y-%m-%d %H:%M:%S"'
$ echo "$($nice_date)"
date: extra operand ‘%H:%M:%S"
Try 'date --help' for more information.

এটি করার সঠিক উপায় কী, তাই সেই তারিখটি একটি সঠিক যুক্তি পাওয়ার জন্য?


পার্শ্ব নোট হিসাবে, "%F %T"আপনি জিএনইউ ব্যবহার করছেন তবে আপনার তারিখ বিন্যাসের স্ট্রিংটি ছোট করা যেতে পারে date
জর্দানম

সমস্যা স্থান। আপনি যদি ব্যবহার করেন nice_date="date +%Y-%m-%d-%H:%M:%S", এটি কাজ করে। দ্বিতীয় শেল থেকে সেই স্থানটি কীভাবে সুরক্ষিত করা যায় তা আমি বর্তমানে দেখতে পাচ্ছি না।
ম্যাডহ্যাটার

উত্তর:


13

আপনার উদাহরণটি ব্যর্থ হওয়ার কারণটি শেলের শব্দ বিভাজনের কাজটি। আপনি যখন রান করবেন তখন "$($nice_date)"শেলটি dateদুটি আর্গুমেন্টের সাহায্যে কমান্ডটি কার্যকর করছে "+%Y-%m-%d"এবং "%H:%M:%S"। এটি ব্যর্থ হয়েছে কারণ তারিখের ফর্ম্যাট স্ট্রিংটি অবশ্যই একক যুক্তি হতে পারে।

এটি করার সর্বোত্তম উপায় হ'ল ভেরিয়েবলে কমান্ডটি সংরক্ষণ করার পরিবর্তে একটি ফাংশন ব্যবহার করা:

format_date() {
  # echo is not needed
  date "+%Y-%m-%d %H:%M:%S" "$1"
}
format_date
format_date "2015-09-17 16:51:58"
echo "$(format_date) [WARNING] etc etc"

আপনি যদি সত্যই কমান্ডটি একটি ভেরিয়েবলের মধ্যে সঞ্চয় করতে চান তবে আপনি একটি অ্যারে ব্যবহার করতে পারেন:

nice_date=(date "+%Y-%m-%d %H:%M:%S")
# again echo not needed
"${nice_date[@]}" "2015-09-17 16:51:58"

কোনও ভেরিয়েবলে কমান্ড সংরক্ষণের জটিল ক্ষেত্রে আরও বিশদের জন্য, বাশফ্যাঙ্ক 050 দেখুন


আপনাকে ধন্যবাদ, তবে আমি আগ্রহী যে আমার দৃষ্টিভঙ্গি কেন কাজ করছে না, আপনি কি সে সম্পর্কে বিস্তারিত বলতে পারবেন?
gilbertasm

@ গিলবার্টাসম উত্তর আপডেট হয়েছে
জর্দান 2

1
date: extra operand ‘’উপরের উভয় পদ্ধতির সাথে আমি ত্রুটি পেয়েছি
জেফ পেকেট

3

আমি সম্মত একটি ফাংশন যাওয়ার সবচেয়ে ভাল উপায়। বিকল্প হিসাবে কেবল পুরো কমান্ডের পরিবর্তে ভেরিয়েবল হিসাবে বিন্যাসটি সংরক্ষণ করুন:

$ nice_date='+%Y-%m-%d %H:%M:%S'
$ echo "$(date "$nice_date") [WARNING] etc etc"

1
@ কুসালানন্দ: একেবারে ঠিক। ধন্যবাদ! উত্তর আপডেট করেছেন
আদম

এবং, ওম, দুঃখিত, তবে echoএবং কমান্ডের প্রতিস্থাপনটিও অতিরিক্ত অতিরিক্ত।
কুসালানন্দ

1
হ্যাঁ, তারা ব্যবহৃত কাট-ডাউন উদাহরণগুলিতে তারা প্রযুক্তিগতভাবে অতিরিক্ত ছিল না (আমি তর্ক করতে পারি তারা আরও পাঠযোগ্য কোড উত্পাদন করে তবে এটি স্বাদের প্রশ্ন)। ওপি থেকে উদাহরণটি ব্যবহার করতে আপডেট করেছেন, যে ক্ষেত্রে তাদের প্রয়োজন
অ্যাডাম

হ্যাঁ, এই উদাহরণটি আরও অর্থবোধ করে।
কুসালানন্দ

1

সংক্ষিপ্ত উত্তরটি হ'ল

#if you want to store in a variable
now=$(date '+%F" "%T');
echo $now

#or direct output (single quote may not needed)
date '+%F" "%T'

1

একটি সহজ উপায় হ'ল escape দিয়ে স্থানটি 'পালাতে' \

nice_date="date +%Y-%m-%d\ %H:%M:%S"

0

নীচে চেষ্টা করুন:

আপনাকে কীবোর্ডের টিলড কীতে থাকা প্রতীকটি "` "যুক্ত করতে হবে। প্রতীকটি প্রথমে কমান্ডটি কার্যকর করতে শেল এবং তারপরে ভেরিয়েবলকে বরাদ্দ দেয়।

[root@RHEL01 ~]# My_Var=`date +"%Y-%m-%d %H:%M:%S"`
[root@RHEL01 ~]# echo $My_Var
2015-09-17 10:05:30
[root@RHEL01 ~]#

আয়ানের উত্তর হিসাবে একই সমস্যা।
ম্যাডহ্যাটার

0

পরিবর্তে:

nice_date="date +%Y-%m-%d %H:%M:%S"
echo "$($nice_date)"

চেষ্টা করুন:

nice_date_format="+%Y-%m-%d %H:%M:%S"
echo $(date "$nice_date_format")

এছাড়াও, আপনার শেষ কমান্ডের বিকল্পের দরকার নেই:

date "$nice_date_format"

-1

একই সমস্যা ছিল; বিচ্ছিন্নভাবে প্রসেসিংয়ের জন্য একটি ডাব্লুটিকে একটি দুরন্ত প্রিন্টে রাখতে হয়েছিল। আমি ব্যবহার করতাম

DATE1=`date +%Y-%m-%d`

DATE2=`date +%T`

তারপর

awk ' { print "['$DATE1' '$DATE2'] topic=" $1, etc

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