Lewati argumen baris perintah ke skrip bash


114

Saya baru mengenal pemrograman skrip bash.

Saya ingin mengimplementasikan skrip bash 'deploymLog', yang menerima sebagai input argumen satu string (nama).

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

di sini saya ingin meneruskan argumen string (nama) melalui baris perintah

Sebagai langkah awal, saya perlu menambahkan cap waktu saat ini bersama dengan string input ini ke file log katakanlah Logone.txtdi direktori saat ini dalam format di bawah ini:

[name]=[System time timestamp1]

Bagaimana itu mungkin?

Jawaban:


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

Argumen pertama dari baris perintah dapat ditemukan dengan parameter posisi $1. [[ -n "$name" ]]tes untuk melihat apakah $nametidak kosong. date +%smengembalikan stempel waktu saat ini dalam waktu Unix. The >>operator yang digunakan untuk menulis ke file dengan menambahkan ke data yang ada dalam file.

$> ./deploymLog.sh tt

$> cat Logone.txt 
tt=1329810941

$> ./deploymLog.sh rr

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

Untuk cap waktu yang lebih mudah dibaca, Anda bisa bermain dengan dateargumen.


7
total pemula di sini ... akan sangat membantu untuk mengetahui [[ -n "$name" ]]bagian apa yang sedang dilakukan.
MichaelChirico

Yup, itu benar, aku juga noob total dan skripku hampir mati di baris itu ???
pythonian29033

4
"[[-N" $ name "]]" adalah bentuk lain dari perintah "test". Lihat: ss64.com/bash/test.html
jewettg

64

Argumen baris perintah Shell dapat diakses melalui $1(pertama), $n(ke-n), atau $*(semua argumen), jadi skrip Anda harus dimulai:

#!/bin/bash

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

name=$1

Sekarang argumen nama dapat diakses dari skrip sebagai $name.

Untuk mendapatkan cap waktu gunakan date(1)perintah dan berikan penentu format sehingga menghasilkan format yang Anda inginkan:

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

Sekarang $nowberisi tanggal dan waktu saat ini.

Jadi Anda dapat membuat file log Anda dengan demikian:

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

Anda lebih baik menggunakan fungsi shell untuk mencatat pesan Anda karena akan lebih mudah digunakan:

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

Perhatikan bahwa fungsi shell mengakses argumen mereka sendiri dengan cara yang sama seperti skrip (via $1dll.)

Jadi skrip awal terlihat seperti ini:

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

(perhatikan file log tidak dalam format persis yang Anda tentukan; itu dalam format yang lebih baik dengan stempel waktu di awal setiap baris).


7
#!/bin/bash

name=$1

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

jalankan "bash deploymLog.sh terserah", dan Anda mendapat x.log dengan

20120220-23:53:50 =>  whatever

ketika Anda memilih, berikan alasan, terima kasih.

Saya kira downvoter melewatkan alasan name=$1. Variabel $ name tidak pernah digunakan, karena Anda hanya menampilkan string 'nama' secara harfiah.
manatwork

oh, salahku terima kasih telah menunjukkan. saya harus lebih berhati-hati.
Dyno Fu

@DynoHongjunFu Namun, variabel memiliki nama dan nilai yang sama, yang bukan cara yang baik untuk membuat contoh dapat dibaca.
Volker Siegel

Yang terbaik adalah mengutip var ketika menugaskan untuk nama seperti ini:name="$1"
Jake
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.