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?

l0b0
sumber

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.

ДМИТРИЙ МАЛИКОВ
sumber
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).

trojanfoe
sumber
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
Dyno Fu
sumber
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