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

135 shell scripting bash

我是 bash 脚本编程的新手。

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

[root@localhost Desktop]# ./deploymLog.sh name
Run Code Online (Sandbox Code Playgroud)

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

作为初始步骤,我需要将当前时间戳与此输入字符串一起附加到日志文件Logone.txt中,该文件位于当前目录中,格式如下:

[name]=[System time timestamp1]
Run Code Online (Sandbox Code Playgroud)

怎么可能?

ДМИ*_*КОВ 132

$> 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
Run Code Online (Sandbox Code Playgroud)

命令行中的第一个参数可以通过位置参数找到$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
Run Code Online (Sandbox Code Playgroud)

要获得更易读的时间戳,您可以使用date参数。

  • 这里的初学者......知道`[[ -n "$name" ]]` 部分在做什么会很有帮助。 (8认同)
  • "[[ -n "$name" ]]" 是 "test" 命令的另一种形式。见:http://ss64.com/bash/test.html (5认同)

小智 73

Shell 命令行参数可通过$1(第一个)、$n(第 n 个)或$*(所有参数)访问,因此您的脚本应该开始:

#!/bin/bash

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

name=$1
Run Code Online (Sandbox Code Playgroud)

现在可以从脚本访问 name 参数作为$name.

要获取时间戳,请使用该date(1)命令并为其指定格式说明符,以便生成您想要的格式:

now=$(date +%Y%m%d%H%M%S)
Run Code Online (Sandbox Code Playgroud)

现在$now包含当前日期和时间。

所以你可以这样创建你的日志文件:

logfile=/path/to/log/file/mylogfile.$now
echo "[$name]=[$now]" >> $logfile
Run Code Online (Sandbox Code Playgroud)

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

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

请注意,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
Run Code Online (Sandbox Code Playgroud)

(请注意,日志文件的格式与您指定的格式不同;它的格式更好,每行开头都有时间戳)。


Dyn*_* Fu 9

#!/bin/bash

name=$1

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

运行“bash deploymLog.sh 随便”,你就得到了 x.log

20120220-23:53:50 =>  whatever
Run Code Online (Sandbox Code Playgroud)