Bash betiğine komut satırı argümanlarını ilet


114

Ben bash script programlamada yeniyim.

Girdi olarak bir dize argümanı (isim) kabul eden bir bash betiği 'deploymLog' uygulamak istiyorum.

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

burada string argümanını (name) komut satırından geçirmek istiyorum

İlk adım olarak, bu dizgeyle birlikte geçerli zaman damgasını Logone.txtaşağıdaki dizinde mevcut dizinde yazan bir günlük dosyasına eklemeliyim:

[name]=[System time timestamp1]

Bu nasıl mümkün olabilir?

Yanıtlar:


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

Bir komut satırından ilk argüman positional parametresi ile bulunabilir $1. boş olmadığını [[ -n "$name" ]]görmek için testler $name. date +%sUnix zamanında geçerli zaman damgasını döndürür. >>Operatör dosyasında mevcut verilere iliştirerek bir dosyaya yazmak için kullanılır.

$> ./deploymLog.sh tt

$> cat Logone.txt 
tt=1329810941

$> ./deploymLog.sh rr

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

Daha okunaklı zaman damgası için datedeğişkenlerle oynayabilirsiniz .


7
Buradaki toplam acemi ... [[ -n "$name" ]]parçanın ne yaptığını bilmek faydalı olacaktır .
MichaelChirico

Evet, bu doğru, ben de tam bir noob ve senaryom bu satırda ölüyor ???
pythonian29033

4
"[[-N" $ name "]]", "test" komutunun başka bir şeklidir. Bakınız: ss64.com/bash/test.html
jewettg

64

Shell komut satırı argümanlarına $1(ilk), $n(nth) veya $*(tüm argümanlar) yoluyla erişilebilir , bu nedenle komut dosyanızın başlaması gerekir:

#!/bin/bash

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

name=$1

Şimdi isim argümanına betiğinden şu şekilde erişilebilir $name.

Zaman damgasını almak için date(1)komutu kullanın ve istediğiniz formatı üretecek şekilde bir format belirteci verin:

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

Şimdi $nowgeçerli tarih ve saati içerir.

Böylece günlük dosyanızı bu şekilde oluşturabilirsiniz:

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

İletilerinizi kullanmak daha kolay olacağından, oturum açmak için bir kabuk işlevi kullanmaktan daha iyidir:

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

Kabuk işlevlerinin kendi argümanlarına komut dosyasıyla ( $1vb.) Aynı şekilde eriştiğini unutmayın .

Böylece ilk komut dosyası şöyle görünür:

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

(günlük dosyasının belirttiğiniz biçimde olmadığına dikkat edin; her satırın başında zaman damgasıyla daha iyi bir dosyadadır).


7
#!/bin/bash

name=$1

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

"bash deploymLog.sh neyse" komutunu verin, ve x.log

20120220-23:53:50 =>  whatever

Oy kullandığınızda, bir sebep verin, teşekkürler.

Sanırım indirici sebebini özledi name=$1. $ Name değişkeni hiçbir zaman kullanılmaz, çünkü kelimenin tam anlamıyla yalnızca 'name' dizesini çıkarırsınız.
Manatwork

Ah benim hatam. işaret ettiğin için teşekkürler. daha dikkatli olmam gerekiyor.
Dyno Fu

@DynoHongjunFu Yine de değişken aynı adı ve değere sahiptir; bu, örneği okunabilir hale getirmek için iyi bir yol değildir.
Volker Siegel

Bu gibi bir isme atanırken var alıntı yapmak en iyisidir:name="$1"
Jake
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.