编辑:

编辑:

我有一个包含以下几行的脚本:

TIMESTAMP_END=$(date +"%s")
FILE=${DIR}/recording_$TIMESTAMP_BEGIN-$TIMESTAMP_END.$EXT
mv ${TMP_FILE} ${FILE}

脚本在 Raspberry Pi 上运行,TIMESTAMP_END 变量随后用作变量 FILE 所表示的文件名的一部分。我遇到过两次结果变量显然是空字符串的情况,因为 FILE 最终是 recording_1469556286-.mp3,结束时间戳不存在,因此我假设它是空字符串。我无法重现它。

可能是什么原因呢?

答案1

编辑:

我怀疑它试图扩展一个不存在的变量。我几乎可以肯定,通过用括号 ( ${TIMESTAMP_BEGIN}-${TIMESTAMP_END}) 包裹所有变量,它将按预期工作。

例如将代码改为:

# set timestamp_end:
TIMESTAMP_END=$(date +%s)
# the following uses variable expansion to expand timestamp_end
# to unknown if the variable truly is unset. Replace `:-` with :=
# if you would like to assign the value "Unknown" to timestamp_end
# if timestamp_end is null or undefined.
FILE=${DIR}/recording_${TIMESTAMP_BEGIN}-${TIMESTAMP_END:-"Unknown"}.${EXT}
mv ${TMP_FILE} ${FILE}

如果变量TIMESTAMP_END确实为空或未定义,则将输出“未知”,并且您将确定问题是否出在变量扩展上date,或者问题是否是变量扩展的工作方式与您预期的不同。


原始帖子:

您是否有可能在一个进程中设置变量,而在另一个进程中检查该变量?变量只能由其自己的进程访问。如果您正在运行设置变量的脚本,则在您使用它们之后,除非您使用 ,否则您的终端将无法访问它们source。我将通过一个例子来说明这一点:

一个

#!/bin/bash

export onetime=$(date +%s)
echo "Time is: $onetime"

在你的终端中:

$ charlie on work-laptop in ~/test
❯❯ ./one.sh
Time is: 1469546203

$ charlie on work-laptop in ~/test
❯❯ echo $onetime


$ charlie on work-laptop in ~/test
❯❯ source one.sh
Time is: 1469546211

$ charlie on work-laptop in ~/test
❯❯ echo $onetime
1469546211

还需要注意的是,如果您的脚本产生了任何新进程,例如使用子shell,则该新进程中设置的变量将无法在进程之外访问。

二.sh

#!/bin/bash

export var="[1st Value]"
echo "Var is $var"

(echo "Enter 1st subshell: "; var="[2nd Value]"; echo "=> Var is $var")
echo $var

(echo "Enter 2nd subshell: "; export var="[3rd Value]"; echo "=> Var is $var")
echo $var

当我们运行它时,输出是:

$ charlie on work-laptop in ~/test
❯❯ ./two.sh
Var is [1st Value]
Enter 1st subshell:
=> Var is [2nd Value]
[1st Value]
Enter 2nd subshell:
=> Var is [3rd Value]
[1st Value]

答案2

您不需要在%s,周围使用双引号date +%s。此外,如果TIMESTAMP_END变量在脚本中本地使用而不是作为全局环境变量导出,有些人会建议使用小写来帮助区分局部变量和全局变量;如果您对这种风格变化感兴趣,结果将是:

timestamp_end=$(date +%s)

相关内容