1)如果我操作整数,我应该使用$(())吗?
>typeset -i x=0
>typeset -i y=0
>typeset -i z=0
>y=$(($x+1))
>print $y
1
>z=$x+1
>print $z
1
正如您所看到的,z和y都有正确的结果 只有在变量未声明为整数的情况下才有区别:
>typeset j
>typeset k
>j=$(($x+1))
>print $j
1
>k=$x+1
>print $k
0+1
2)$(($ x + 1))和$((x + 1))之间有什么区别?
打印$(($ x + 1))
1
print $((x + 1))
1
与let有相同的情况:
X = 1个
设x = $ x + 1
打印$ x
2
设x = x + 1
打印$ x
3
答案 0 :(得分:2)
2)在$x
中展开$((..))
,您可以在文本上构建表达式:
NUM1=3
NUM2=5
NUM3=7
for OP1 in + - \* /; do
for OP2 in + - \* /; do
echo $((NUM1 $OP1 NUM2 $OP2 NUM3));
done
done
显然它不适用于$((NUM1 OP1 NUM2))
等。
另一种可能性(没有$
)可用于修改变量:
X=0
Y=1
echo $((Y << (++X))) # prints 2, which is 1 << 1; increments X
echo $X # prints 1
对于1),我使用$((..))
,因为它是POSIX,但是,我不认为它在ksh中很重要。
答案 1 :(得分:2)
1)如果我操作整数,我应该使用$(())吗?
与编程中的大多数事情一样,“它取决于”。如果您认为您的代码将在只有bourne shell的旧unix系统上使用,那么该语法将不起作用。
如果你将永远处于一个完全现代化的环境中,那么$(( ... ))
语法真正最有意义,因为它允许简洁和'C语言'之类的表达。
此外,正如其他人所指出的,对于$(( ... ))
内的任何数字变量,您可以节省输入并消除前导'$'。 ; - )
2)$(($ x + 1))和$((x + 1))有什么区别?
如前一段所示,除了必须少输入1个字符外,没有区别。
最后,我赞扬你自己解决问题的方法。你的小测试帮助你自己证明了这些事实,这是一种方法我希望更多关于S.O的问题海报会学习使用! ;-)。
您正在理解如何改善shell知识。如果您不了解shell中可用的各种调试工具,请参阅Using nohup to execute command very confused?中的第3段,r.e。 set -vx
和PS4=...
。
我希望这会有所帮助。
答案 2 :(得分:1)
2)在评估$(())之前扩展$ x:
x=1+
echo $(($x 1))
=>2
echo $((x 1))
=>syntax error when trying to make an operand from "1+"