コマンドライン引数をbashスクリプトに渡す


114

bashスクリプトプログラミングは初めてです。

入力として1つの文字列引数(名前)を受け入れるbashスクリプト '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" ]]かどうかをテストします$namedate +%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

うん、それは本当です。私も完全な初心者であり、私のスクリプトはその行で死にかけていますか?
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引数にとしてアクセスできます$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は使用されません。
マナトワーク

ああ、私の悪い。指摘してくれてありがとう。もっと注意する必要があります。
ダイノFuの

@DynoHongjunFuそれでも、変数は同じ名前と値を持っているので、例を読みやすくする良い方法ではありません。
フォルカージーゲル14年

次のように名前を割り当てる場合は、varを引用するのが最適ですname="$1"
Jake
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.