可变替代

时间:2014-06-07 04:18:00

标签: bash variables sh freebsd

使用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=''

1 个答案:

答案 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