使用背景命令是有效的:
`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而言,这是合法的,因为背部是命令替代的一种形式。但是$(...)
命令替代的形式是优选的。