বাশ স্ক্রিপ্টে কমান্ড লাইন আর্গুমেন্টগুলি পাস করুন


114

আমি স্ক্রিপ্ট প্রোগ্রামিং বাশ করতে নতুন।

আমি একটি ব্যাশ স্ক্রিপ্ট 'ডিপ্লোয়িমলগ' প্রয়োগ করতে চাই, যা ইনপুট হিসাবে একটি স্ট্রিং আর্গুমেন্ট (নাম) হিসাবে গ্রহণ করে।

[root@localhost Desktop]# ./deploymLog.sh name

এখানে আমি কমান্ড লাইনের মাধ্যমে স্ট্রিং আর্গুমেন্ট (নাম) পাস করতে চাই

প্রাথমিক পদক্ষেপ হিসাবে, আমাকে এই ইনপুট স্ট্রিংয়ের সাথে বর্তমান টাইমস্ট্যাম্পটি একটি লগ ফাইলের Logone.txtসাথে সংযুক্ত করতে হবে নীচের বিন্যাসে বর্তমান ডিরেক্টরিতে:

[name]=[System time timestamp1]

কিভাবে সম্ভব?

উত্তর:


112
$> cat ./deploymLog.sh 
#!/bin/bash

name=$1
log_file="Logone.txt"

if [[ -n "$name" ]]; then
    echo "$1=$( date +%s )" >> ${log_file}
else
    echo "argument error"
fi

কমান্ড লাইন থেকে প্রথম যুক্তি অবস্থানগত প্যারামিটারের সাথে পাওয়া যাবে $1। খালি নয় [[ -n "$name" ]]কিনা $nameতা পরীক্ষা করে দেখুন । date +%sইউনিক্স সময়ে বর্তমান টাইমস্ট্যাম্পটি প্রদান করে। >>অপারেটর ফাইলে বিদ্যমান ডেটাতে সংযোজন করে একটি ফাইলে লিখতে ব্যবহার করা হয়।

$> ./deploymLog.sh tt

$> cat Logone.txt 
tt=1329810941

$> ./deploymLog.sh rr

$> cat Logone.txt 
tt=1329810941
rr=1329810953

আরও পঠনযোগ্য টাইমস্ট্যাম্পের জন্য আপনি dateযুক্তি দিয়ে খেলতে পারেন ।


7
মোট শিক্ষানবিশ এখানে ... [[ -n "$name" ]]অংশটি কী করছে তা জানতে সহায়ক হবে ।
মাইকেলচিরিকো

হ্যাঁ, এ কথা সত্য যে আমিও মোট নুব এবং আমার স্ক্রিপ্টটি সেই লাইনে মারা যাচ্ছে ???
পাইথোনিয়ান 29033

4
"[[-N" $ নাম "]]" "পরীক্ষা" কমান্ডের অন্য একটি রূপ। দেখুন: ss64.com/bash/test.html
jewettg

64

শেল কমান্ড লাইন আর্গুমেন্টগুলি $1(প্রথম), $n(নবম), বা $*(সমস্ত যুক্তি) মাধ্যমে অ্যাক্সেসযোগ্য , তাই আপনার স্ক্রিপ্টটি শুরু করা উচিত:

#!/bin/bash

if [ $# -ne 1 ]; then
    echo $0: usage: myscript name
    exit 1
fi

name=$1

এখন নাম যুক্তিটি স্ক্রিপ্ট থেকে অ্যাক্সেসযোগ্য $name

টাইমস্ট্যাম্পটি পেতে date(1)কমান্ডটি ব্যবহার করুন এবং এটিকে একটি ফর্ম্যাট স্পেসিফায়ার দিন যাতে এটি আপনার পছন্দ মতো ফর্ম্যাটটি তৈরি করে:

now=$(date +%Y%m%d%H%M%S)

এখন $nowবর্তমান তারিখ এবং সময় রয়েছে।

সুতরাং আপনি এইভাবে আপনার লগ ফাইল তৈরি করতে পারেন:

logfile=/path/to/log/file/mylogfile.$now
echo "[$name]=[$now]" >> $logfile

আপনার বার্তাগুলি লগ করতে শেল ফাংশনটি ব্যবহার করা ভাল কারণ এটি ব্যবহার করা সহজ হবে:

function logit
{
    now=$(date +%Y%m%d%H%M%S)
    echo "$now: $*" >> $logfile
}

নোট করুন যে শেল ফাংশনগুলি তাদের নিজস্ব আর্গুমেন্টগুলিকে স্ক্রিপ্টের (একইভাবে $1) মাধ্যমে অ্যাক্সেস করে

সুতরাং প্রাথমিক স্ক্রিপ্টটি এর মতো দেখাচ্ছে:

#!/bin/bash

function logit
{
    now=$(date +%Y%m%d%H%M%S)
    echo "$now: $*" >> $logfile
}

if [ $# -ne 1 ]; then
    echo $0: usage: myscript name
    exit 1
fi

name=$1
now=$(date +%Y%m%d%H%M%S)
logfile=/path/to/log/file/mylogfile.$now

logit name = $name

(নোট করুন লগ ফাইলটি আপনার নির্দিষ্ট ফর্ম্যাটে নির্দিষ্ট নয়; প্রতিটি লাইনের শুরুতে টাইমস্ট্যাম্পের সাথে এটি আরও ভাল।


7
#!/bin/bash

name=$1

echo "$(date '+%Y%m%d-%H:%M:%S') => " $name >> x.log

"ব্যাশ ডিপ্লোয়িমলগ.শ যাই হোক" চালান, এবং আপনি x.log পেয়েছেন

20120220-23:53:50 =>  whatever

আপনি যখন ভোট দেন, একটি কারণ দিন, ধন্যবাদ।

আমি মনে করি ডাউনওয়টার এর কারণটি মিস করেছে name=$1। ভেরিয়েবল $ নামটি কখনই ব্যবহৃত হয় না, কারণ আপনি কেবল আক্ষরিকভাবে 'নাম' স্ট্রিং আউটপুট করেন।
manatwork

ওহ! আমার দুরবস্থা. নির্দেশ করার জন্য ধন্যবাদ আমার আরও যত্নবান হওয়া দরকার
ডায়নু ফু

@ ডায়নো হংজুনফু তবুও, ভেরিয়েবলের একই নাম এবং মান রয়েছে, যা উদাহরণটিকে পাঠযোগ্য করে তোলার পক্ষে ভাল উপায় নয়।
ভোলকার সিগেল

এটির মতো নাম নির্ধারণের সময় ভেরটি উদ্ধৃত করা ভাল:name="$1"
জ্যাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.