当前时间/日期作为 BASH 中的变量并使用脚本停止程序

Rec*_*rty 7 bash real-time shell-script environment-variables timestamps

我正在尝试创建一个 raspberry pi spy cam bug。我正在努力使为各种进程创建的新文件提出

NOW=`date '+%F_%H:%M:%S'`;
Run Code Online (Sandbox Code Playgroud)

这工作正常。但它需要一个echo来更新时间 $NOW也在/home/pi/.bashrc文件中同样的问题,不更新wo

. ~/.bashrc 
Run Code Online (Sandbox Code Playgroud)

在这个论坛上找到它并且它有效:

#! /bin/bash

NOW=`date '+%F_%H:%M:%S'`;

filename="/home/pi/gets/$NOW.jpg"

raspistill -n -v -t 500 -o $NOW.jpg;

echo $filename;
Run Code Online (Sandbox Code Playgroud)

我不明白它是如何工作的,因为它在 raspistil 的输出之前和引号中。

谢谢大家!!!

Kus*_*nda 22

当你做

NOW=`date '+%F_%H:%M:%S'`
Run Code Online (Sandbox Code Playgroud)

或者,使用更现代的语法,

NOW=$( date '+%F_%H:%M:%S' )
Run Code Online (Sandbox Code Playgroud)

该变量NOW将在date执行该行时设置为命令的输出。如果您在 中执行此操作~/.bashrc$NOW则将是一个时间戳,告诉您何时开始当前交互式 shell 会话。

您还可以设置变量的值

printf -v NOW '%(%F_%H:%M:%S)T' -1
Run Code Online (Sandbox Code Playgroud)

如果您使用的是bash4.2 版或更高版本。这会将时间戳直接打印到变量中,而无需调用date.

在您显示NOW的脚本中,运行脚本时正在设置变量(这就是您想要的)。

当任务

filename="/home/pi/gets/$NOW.jpg"
Run Code Online (Sandbox Code Playgroud)

执行时,shell 将扩展字符串中的变量。即使它是双引号,它也会这样做。 单引号阻止 shell 扩展嵌入的变量(在这种情况下这不是你想要的)。

请注意,您似乎并没有filename在调用中实际使用该变量raspistill,所以我不确定为什么要设置它的值,除非您只想echo在最后输出它。

在其余代码中,您应该双引号$NOW变量扩展(和$filename)。如果不这样做,并且稍后更改定义方式NOW以使其包含空格或通配符(文件名通配符模式),则使用的命令$NOW可能无法正确解析其命令行。

比较,例如,

string="hello * there"

printf 'the string is "%s"\n' $string
Run Code Online (Sandbox Code Playgroud)

string="hello * there"

printf 'the string is "%s"\n' "$string"
Run Code Online (Sandbox Code Playgroud)

相关事项: