Bash中声明,排版和局部变量之间的差异

时间:2010-12-11 23:59:22

标签: bash shell variables scope declare

在Bash中输入变量时,declaretypeset之间有什么区别?在函数内部使用时:declaretypesetlocal之间的区别是什么?

我遇到的唯一区别是typeset可以移植到ksh脚本。除此之外,有什么理由说为什么一个人应该优先于另一个?

更新:在问题中添加了local

3 个答案:

答案 0 :(得分:21)

  • typesetdeclare之间的差异:

前者更具便携性(例如ksh),而后者在不考虑便携性时更为可取。

  • 在函数内使用declare(或typeset)和local之间的差异:

前者暗示后者,但更强大。例如,declare -i x使x具有integer属性,declare -r x使x具有只读等等。

答案 1 :(得分:11)

就bash而言,不,没有区别。实际上,联机帮助页让它们具有相同的定义

  

声明[-aAfFilrtux] [-p]   [name [= value] ...]
排版   [-aAfFilrtux] [-p] [name [= value]   ......]
声明变量和/或   给他们属性。如果没有名字   给出然后显示的值   变量。将显示-p选项   每个人的属性和价值观   名称...

我还发现this little tidbit进一步证实了我的主张以及您提到的ksh便携性。

  

声明或排版内置,    是完全同义词 ,允许修改变量的属性。   这是一种非常弱的打字形式   [1]在某些编程中可用   语言。 declare命令是   特定于版本2或更高版本   击。 typeset命令也有效   在ksh脚本中。

答案 2 :(得分:4)

在[{3}}部分的Bash手册中,它指出:

  

'排版'
            typeset [-afFrxi] [-p] [NAME [= VALUE] ...]
       提供'typeset'命令是为了与Korn兼容        贝壳;然而,它被弃用以支持'声明'        内置命令。