我应该使用$(())来计算ksh中的算术表达式吗?

时间:2011-09-15 10:24:09

标签: unix ksh

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

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 -vxPS4=...

我希望这会有所帮助。

答案 2 :(得分:1)

2)在评估$(())之前扩展$ x:

x=1+
echo $(($x 1)) 
=>2
echo $((x 1)) 
=>syntax error when trying to make an operand from "1+"