1.declare 命令
declare
命令可以声明一些特殊类型的变量,为变量设置一些限制,比如声明只读类型的变量和整数类型的变量。它的语法形式如下。
declare OPTION VARIABLE=value
declare
命令的主要参数(OPTION)如下。-a
:声明数组变量。-f
:输出所有函数定义。-F
:输出所有函数名。-i
:声明整数变量。-l
:声明变量为小写字母。-p
:查看变量信息。-r
:声明只读变量。-u
:声明变量为大写字母。-x
:该变量输出为环境变量。
declare
命令如果用在函数中,声明的变量只在函数内部有效,等同于local
命令。不带任何参数时,
declare
命令输出当前环境的所有变量,包括函数在内,等同于不带有任何参数的set
命令。$ declare
1.1 -i
参数
-i
参数声明整数变量以后,可以直接进行数学运算。$ declare -i val1=12 val2=5 $ declare -i result $ result=val1*val2 $ echo $result 60
上面例子中,如果变量
result
不声明为整数,val1*val2
会被当作字面量,不会进行整数运算。另外,val1
和val2
其实不需要声明为整数,因为只要result
声明为整数,它的赋值就会自动解释为整数运算。注意,一个变量声明为整数以后,依然可以被改写为字符串。
$ declare -i var=12 $ var=foo $ echo $var 0
上面例子中,变量
var
声明为整数,覆盖以后,Bash 不会报错,但会赋以不确定的值,上面的例子中可能输出0,也可能输出的是3。1.2 -x
参数
-x
参数等同于export
命令,可以输出一个变量为子 Shell 的环境变量。$ declare -x foo # 等同于 $ export foo
1.3 -r
参数
-r
参数可以声明只读变量,无法改变变量值,也不能unset
变量。$ declare -r bar=1 $ bar=2 bash: bar:只读变量 $ echo $? 1 $ unset bar bash: bar:只读变量 $ echo $? 1
上面例子中,后两个赋值语句都会报错,命令执行失败。
1.4 -u
参数
-u
参数声明变量为大写字母,可以自动把变量值转成大写字母。$ declare -u foo $ foo=upper $ echo $foo UPPER
1.5 -l
参数
-l
参数声明变量为小写字母,可以自动把变量值转成小写字母。$ declare -l bar $ bar=LOWER $ echo $bar lower
1.6 -p
参数
-p
参数输出变量信息。$ foo=hello $ declare -p foo declare -- foo="hello" $ declare -p bar bar:未找到
上面例子中,
declare -p
可以输出已定义变量的值,对于未定义的变量,会提示找不到。如果不提供变量名,
declare -p
输出所有变量的信息。$ declare -p
1.7 -f
参数
-f
参数输出当前环境的所有函数,包括它的定义。$ declare -f
1.8 -F
参数
-F
参数输出当前环境的所有函数名,不包含函数定义。$ declare -F
2.readonly 命令
readonly
命令等同于declare -r
,用来声明只读变量,不能改变变量值,也不能unset
变量。$ readonly foo=1 $ foo=2 bash: foo:只读变量 $ echo $? 1
上面例子中,更改只读变量
foo
会报错,命令执行失败。readonly
命令有三个参数。-f
:声明的变量为函数名。-p
:打印出所有的只读变量。-a
:声明的变量为数组。
3.let 命令
let
命令声明变量时,可以直接执行算术表达式。$ let foo=1+2 $ echo $foo 3
上面例子中,
let
命令可以直接计算1 + 2
。let
命令的参数表达式如果包含空格,就需要使用引号。$ let "foo = 1 + 2"
let
可以同时对多个变量赋值,赋值表达式之间使用空格分隔。$ let "v1 = 1" "v2 = v1++" $ echo $v1,$v2 2,1
上面例子中,
let
声明了两个变量v1
和v2
,其中v2
等于v1++
,表示先返回v1
的值,然后v1
自增。