स्क्रिप्ट को कोसने के लिए कमांड लाइन तर्क पास करें


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" ]]देखने के लिए परीक्षण $namedate +%sयूनिक्स समय में वर्तमान टाइमस्टैम्प लौटाता है। >>ऑपरेटर फ़ाइल में मौजूद डेटा को जोड़कर एक फ़ाइल पर लिखने में प्रयोग किया जाता है।

$> ./deploymLog.sh tt

$> cat Logone.txt 
tt=1329810941

$> ./deploymLog.sh rr

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

अधिक पठनीय टाइमस्टैम्प के लिए आप dateतर्कों के साथ खेल सकते हैं ।


7
कुल शुरुआत यहाँ ... यह जानना उपयोगी होगा कि [[ -n "$name" ]]भाग क्या कर रहा है।
माइकलचिरिको

हाँ, यह सच है कि मैं भी कुल नोबल हूँ और मेरी स्क्रिप्ट उस लाइन पर मर रही है ???
अजगर २

4
"[[-N" $ नाम "]]" परीक्षण "कमांड का दूसरा रूप है। देखें: ss64.com/bash/test.html
jewettg

64

शेल कमांड लाइन तर्क $1(प्रथम), $n(nth), या $*(सभी तर्क) के माध्यम से सुलभ हैं , इसलिए आपकी स्क्रिप्ट को देखना चाहिए:

#!/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

"bash deploymLog.sh जो कुछ भी चलाएं", और आपको x.log मिल गया

20120220-23:53:50 =>  whatever

जब आप वोट देते हैं, तो एक कारण दें, धन्यवाद।

मुझे लगता है कि नीच का कारण याद किया name=$1। चर $ नाम का कभी उपयोग नहीं किया जाता है, क्योंकि आप केवल स्ट्रिंग 'नाम' का शाब्दिक रूप से उत्पादन करते हैं।
manatwork

मेरी गलती है। इशारा करने के लिए धन्यवाद। मुझे और अधिक सावधान रहने की जरूरत है।
डायनो फू

@DynoHongjunFu फिर भी, चर का एक ही नाम और मूल्य है, जो उदाहरण को पठनीय बनाने का एक अच्छा तरीका नहीं है।
वोल्कर साइगेल

इस तरह का नाम देने के लिए var को उद्धृत करना सबसे अच्छा है:name="$1"
Jake
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.