使用反引号命令是否有效:
`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/提交了有关此问题的反馈意见,但我还没有收到他们的回复。
答案 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
已超过$((
。
请注意,根据其他答案,我已使用$(
替换了反引号,因为与反引号不同,它可以嵌套,就像上面一样。