使用SH shell脚本在FreeBSD 8.3中遇到问题。
以下日期命令适用于FreeBSD
date -j -f "%Y/%m/%d" "$ii" '+%s'
脚本需要在FreeBSD和Ubuntu中运行,但上面的日期函数在Ubuntu中不起作用。
这适用于Ubuntu
date --date="$ii" +"%s"
所以我希望有一个变量可以根据操作系统在这两者之间切换。
# Options (freebsd/linux)
recdate=freebsd
ii=2014/06/06
if [ "$recdate" == "freebsd" ]; then
recdate="\`date \-j \-f \"\%Y/\%m/\%d\" \"\$ii\" \'\+\%s\'\`"
else
recdate="\`date \-\-date\=\"\$ii\" \+\"\%s\"\`"
fi
我尝试了多次转义和引用但没有成功。
错误如下(使用set -x):
+ [ '' == freebsd ]
+ date --date= +%s
date: illegal option -- -
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
[-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format]
+ recdate=''
答案 0 :(得分:5)
正如@devnull在评论中指出的那样,您的操作系统测试失败,因为您的$recdate
变量实际上是空的,正如+ [ '' == freebsd ]
输出行在应用{ {1}}。
需要注意的另一点是,您将set -x
(POSIX语法)与[ ... ]
(==
语法)结合起来。
将bash
与=
:[ ... ]
至于检测FreeBSD,我建议你这样做:
[ "$recdate" = "freebsd" ]
或者,如果你想设置一个标志:
if [ "$(uname)" = "FreeBSD" ]; then ....
最后,构建[ "$(uname)" = "FreeBSD" ] && isFreeBSD=1 || isFreeBSD=
# ...
if [ $isFreeBSD ]; then # ....
命令的方式很尴尬。
我建议你创建一个shell函数来封装两个平台之间的差异:
date
<强>有感强>:
@chepner在评论中指出,执行每次调用函数时确定主机操作系统的条件效率都很低。
他建议使用条件一次来定义功能平台 - 具体(请注意,虽然其他语言可能不愿意定义具有相同名称的函数两次,但不同# Shell function that encapsulates differences between FreeBSD and Linux.
toEpochTime() {
if [ "$(uname)" = "FreeBSD" ]; then
date -j -f "%Y/%m/%d" "$1" '+%s'
else
date --date="$1" +"%s"
fi
}
# Invoke the function
toEpochTime '2014/06/06'
语句的分支,if
允许它:)
bash