在$((())内使用`命令'是有效的吗?

  • 本文关键字:有效 命令 bash shell sh
  • 更新时间 :
  • 英文 :


使用背景命令是有效的:

`command`

$(())的内部?

例如,这样:

d=$((`date +%s`+240))

我在shell脚本和提示中尝试了此操作,它有效:

#!/bin/sh -u
# get the date in seconds with offset
d=$((`date +%s`+240))
echo "d="${d}""
echo "date:%s="`date +%s`""

但是,如果我在http://www.shellcheck.net/上进行检查,我会收到此错误:

1  #!/bin/sh -u
2
3  # get the date in seconds with offset
4  d=$((`date +%s`+240))
     ^––SC1073 Couldn't parse this $((..)) expression.
     ^––SC1009 The mentioned parser error was in this $((..)) expression.
        ^––SC1072 Unexpected "`". Fix any mentioned problems and try again.
5  echo "d="${d}""

我的 bash 版本是:

[~] # bash --version
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

,并且要清楚,在我的系统上,sh实际运行bash

[~] # ls -l /bin/sh; which bash
lrwxrwxrwx 1 root root 4 Jul 18  2013 /bin/sh -> bash
/bin/bash

我在http://www.shellcheck.net/上提交了有关此的反馈

是的,它是完全有效的。但是,不建议完全使用背部。您可以改用$()

而posix中允许使用$(( 1 + 1 ))(例如http://pubs.opengroup.org/onlinepubs/009695399/009695399/utiilities/xcu_chap02.html它。

进行$(( $(date +%s)+240 ))的经典方法是这样:

d=$( expr $( date +%s) + 240 )

在这里,我们使用的expr大于$((

请注意,根据其他答案,我用$(代替了Backtick,因为与Backtick不同,它可以像上面一样筑巢。

根据 man bash,算术替代( $((expression))):(添加了强调)

表达式将其视为在双引号范围内,但是括号内的双引号没有得到特别处理。表达式中的所有令牌都会进行参数扩展,字符串扩展,命令替换和报价删除。

就bash而言,这是合法的,因为背部是命令替代的一种形式。但是$(...)命令替代的形式是优选的。

相关内容

  • 没有找到相关文章

最新更新