ส่งผ่านอาร์กิวเมนต์บรรทัดคำสั่งไปยังสคริปต์ทุบตี


114

ฉันยังใหม่กับการเขียนโปรแกรมสคริปต์ทุบตี

ฉันต้องการใช้สคริปต์ทุบตี 'deploymLog' ซึ่งยอมรับว่าเป็นอาร์กิวเมนต์สตริงหนึ่งชื่อ (ชื่อ)

[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ส่งคืนการประทับเวลาปัจจุบันในเวลา Unix >>ผู้ประกอบการที่ใช้ในการเขียนไปยังแฟ้มโดยผนวกกับข้อมูลที่มีอยู่ในแฟ้ม

$> ./deploymLog.sh tt

$> cat Logone.txt 
tt=1329810941

$> ./deploymLog.sh rr

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

สำหรับเวลาที่อ่านได้มากขึ้นคุณสามารถเล่นกับdateข้อโต้แย้ง


7
ยอดรวมเริ่มต้นที่นี่ ... การรู้ว่า[[ -n "$name" ]]ส่วนใดทำประโยชน์
MichaelChirico

ใช่จริงแล้ว ^ s ฉันยังเป็น noob ทั้งหมดและสคริปต์ของฉันกำลังจะตายในบรรทัดนั้น ???
pythonian29033

4
"[[-n" $ name "]]" เป็นอีกรูปแบบหนึ่งของคำสั่ง "test" ดูที่: ss64.com/bash/test.html
jewettg

64

อาร์กิวเมนต์บรรทัดคำสั่งของเชลล์สามารถเข้าถึงได้ผ่านทาง$1(ตัวแรก), $n(ตัวที่ 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

เรียกใช้ "bash deploymLog.sh อะไรก็ตาม" และคุณได้ x.log ด้วย

20120220-23:53:50 =>  whatever

เมื่อคุณลงคะแนนให้เหตุผลขอบคุณ

ฉันคิดว่า downvoter name=$1พลาดเหตุผลของ ไม่ใช้ตัวแปร $ name เนื่องจากคุณส่งออกเฉพาะสตริง 'name' ตามตัวอักษร
จัดการ

โอ้ฉันไม่ดี ขอบคุณสำหรับการชี้ให้เห็น ฉันต้องระวังให้มากขึ้น
Dyno Fu

@DynoHongjunFu ยังคงตัวแปรมีชื่อและค่าเดียวกันซึ่งไม่ใช่วิธีที่ดีในการทำให้ตัวอย่างอ่านได้
Volker Siegel

ดีที่สุดคือการพูด var เมื่อกำหนดที่จะตั้งชื่อเช่นนี้name="$1"
เจค
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.