将命令行参数传递给bash脚本


114

我是bash脚本编程的新手。

我想实现一个bash脚本'deploymLog',该脚本接受一个字符串参数(名称)作为输入。

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

这里我想通过命令行传递字符串参数(名称)

首先,我需要将当前时间戳以及此输入字符串附加Logone.txt到以下格式的日志文件中:

[name]=[System time timestamp1]

怎么可能?

Answers:


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

命令行中的第一个参数可以与positional参数一起找到$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

是的,那是真的,我也是一个菜鸟,我的剧本快要死了???
pythonian29033 '16

4
“ [[-n“ $ name”]]“是“ test”命令的另一种形式。参见: ss64.com/bash/test.html
jewettg '16

64

可通过$1(第一个),$n(第n个)或$*(所有参数)访问Shell命令行参数,因此您的脚本应以以下形式启动:

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

最好使用shell函数来记录您的消息,因为它更易于使用:

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

请注意,shell函数以与脚本相同的方式访问自己的参数(通过$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 what”,然后得到x.log

20120220-23:53:50 =>  whatever

当您投反对票时,请给出理由,谢谢。

我认为下选民错过了原因name=$1。绝对不会使用变量$ name,因为从字面上仅输出字符串'name'。
manatwork '02

哦,我的坏。感谢您指出。我需要更加小心。
Dyno Fu

@DynoHongjunFu变量仍然具有相同的名称和值,这不是使示例易于阅读的好方法。
Volker Siegel 2014年

像这样分配名称时,最好引用var:name="$1"
Jake 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.