在$(()中使用`command`是否有效?

时间:2014-02-03 23:16:59

标签: 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/提交了有关此问题的反馈意见,但我还没有收到他们的回复。

3 个答案:

答案 0 :(得分:3)

是的,它完全有效。但是it is not recommended根本不使用反引号。您可以改为使用$()

答案 1 :(得分:1)

根据man bash,在算术替换($((expression)))内:(强调添加)

  

表达式被视为在双引号内,但括号内的双引号未被特别处理。表达式中的所有标记都经过参数扩展,字符串扩展,命令替换和引用删除。

就bash而言,它是合法的,因为反引号是命令替换的一种形式。但是$(...)形式的命令替换是首选。

答案 2 :(得分:1)

虽然POSIX允许$(( 1 + 1 ))(例如http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html和第2.6.4节),但某些shell可能不支持它。

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

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

在这里,我们使用的expr已超过$((

请注意,根据其他答案,我已使用$(替换了反引号,因为与反引号不同,它可以嵌套,就像上面一样。