我有一个包含以下几行的脚本:
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)