在 bash 脚本中:
我们通过命名来创建变量:
abc=ok
或者我们可以使用declare
declare abc=ok
有什么不同?
为什么 bash 有这么多方法来创建变量?
答案1
从help -m declare
:
姓名
declare
- 设置变量值和属性。概要
declare
[-aAfFgilnrtux
][-p
][name
[ ] ...]=value
描述
设置变量值和属性。
声明变量并赋予它们属性。如果未给出名称,则显示所有变量的属性和值。
选项:
-f
将操作或显示限制为函数名称和定义
-F
限制仅显示函数名称(调试时加上行号和源文件)
-g
在 shell 函数中使用时创建全局变量;否则被忽略
-p
显示每个NAME的属性和值
设置属性的选项:
-a
使 NAME 成为索引数组(如果支持)
-A
使 NAME 成为关联数组(如果支持)
-i
使 NAME 具有“整数”属性
-l
在分配时将 NAME 转换为小写
-n
使 NAME 成为对其值命名的变量的引用
-r
将 NAME 设为只读
-t
使 NAME 具有 'trace' 属性
-u
在分配时将 NAME 转换为大写
-x
导出 NAME
使用 '
+
' 代替 '-
' 关闭给定的属性。具有整数属性的变量
let
在为变量赋值时会执行算术评估(请参阅命令)。当在函数中使用时,
declare
使 NAME 成为本地名称,就像使用local
命令一样。这 '-g
' 选项抑制此行为。退出状态:
返回成功,除非提供了无效选项或发生变量赋值错误。也可以看看
重击(1)
执行
GNU bash,版本 4.3.11(1)-release (i686-pc-linux-gnu)
版权所有 (C) 2013 Free Software Foundation, Inc.
许可证 GPLv3+:GNU GPL 版本 3 或更高版本 <http://gnu.org/许可证/gpl.html>
所以,declare
用于设置变量值和属性。
让我用一个非常简单的例子来展示两个属性的用法:
$ # First Example:
$ declare -r abc=ok
$ echo $abc
ok
$ abc=not-ok
bash: abc: readonly variable
$ # Second Example:
$ declare -i x=10
$ echo $x
10
$ x=ok
$ echo $x
0
$ x=15
$ echo $x
15
$ x=15+5
$ echo $x
20
通过上面的例子,我想你应该明白了declare
变量超过普通变量!这种类型的declare
操作在函数、脚本循环中很有用。
还访问输入变量:声明或排版
答案2
abc=ok
给变量赋值abc
。declare abc
声明一个名为 的变量abc
。两者可以合并为declare abc=ok
。
在 bash 中,与其他 shell 一样,不需要声明字符串和数组变量,因此除非您想传递选项,例如创建关联数组或使变量只读,declare
否则没有必要。然而,在函数内部,确实有所不同:它使变量成为函数的局部变量,这意味着函数外部变量的值(如果有)被保留。 (除非您使用,这使得变量不是局部的;这在与其他选项结合使用时非常有用,例如在函数中创建全局关联数组。)示例:declare -A abc
abc
declare -r
declare
declare -g
declare -gA
f () {
declare a
a='a in f'
b='b in f'
echo "From f: a is $a"
echo "From f: b is $b"
}
a='Initial a'
b='Initial b'
f
echo "After f: a is $a"
echo "After f: b is $b"
输出:
From f: a is a in f
From f: b is b in f
After f: a is Initial a
After f: b is b in f
您可以使用内置函数做的另一件事declare
是
该declare
内置函数是 bash 独有的。它受到强烈的启发,并且非常接近 ksh 的typeset
内置功能,并且 bash 提供了作为兼容性typeset
的同义词。 declare
(我不知道为什么 bash 不直接调用它typeset
)。还有第三个类似的,local
它在其他方面是相同的,但仅在函数内工作。还有export
,与 相同,同样是declare -x
为了兼容性(与每个 Bourne 风格的 shell)。