Shell学习(2)--Shell变量

在Shell中,变量的定义很简单。

Shell变量

定义变量

var="ddiicey"
需要注意的是,与平时我所编写的高级语言(C、C++、Python)等不同,变量名和“=”之间不能有空格。变量名的命名与其他语言一样都遵循如下规则:

  • 命名只能使用英文字母,数字和下划线,并且首个字符不能以数字开头,但可以以下划线“_”开头
  • 变量名中间不能有空格,可以后下划线
  • 不能使用标点符号
  • 不能使用Shell中的关键字作为变量名
下面给出了Shell中一些合法以及非法的变量名示例:
合法的变量名:
RUNOOB
LD_LIBRARY_PATH
_var
var2


非法的变量名:
?var
user+name^runoob


除了上述这种显式的直接赋值方式,还可以用语句给变量赋值,如:
for file in `ls /etc`


以上语句是将/etc下目录的文件名循环出来。请注意,上述符号为“·”,而并不是单引号“‘”

使用变量
使用一个定义过的变量,只需要在变量名前添加$符号即可,如:
user_name="ddiicey"
echo $user_name
echo ${user_name}


变量名外面的花括号是可选的,加花括号是为了帮助解释器识别变量的边界,如下面的这种情况:

user_name="ddiicey"
echo $user_name
echo ${user_name}


如果不给skill变量加花括号,写成echo “I am good at $skillScript”,解释器就会把$skillScript当成一个变量(其未初始化,值为空),代码执行结果就不是我们所期望的样子了。
所以在此,推荐给所有变量加上花括号,这是一个很好的coding style。

对于已经定义的变量,可以被重新定义,如:
user_name="ddiicey"
echo ${user_name}
user_name="tiangeng"
echo ${user_name}

这是合法的,但是该段语句的执行完成后,user_name是第二次定义的值。

只读变量
在实际中,为了防止如上对变量重新定义,可以将变量使用readonly命令定义为只读变量,这样就可以防止变量被修改。

#!/bin/bash
user_name="ddiicey"
readonly user_name
user_name="tiangeng"

对于上述脚本,在运行的时候会报错,结果如下:
/bin/sh: NAME: This variable is read only.

删除变量
使用unset命令可以删除变量,语法如下:
unset variable_name

unset命令不能删除readonly只读变量。

变量类型
运行shell的时候,会同时存在三种变量:
  1. 局部变量 局部变量是在脚本或命令中定义,尽在当前shell实例中有效,其他shell启动的程序不能访问局部变量
  2. 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其能正常运行。必要的时候shell脚本也可以定义环境变量。
  3. shell变量 shell变量是有shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。

shell数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
与C语言类似,数组单元的下标由0开始编号。获取数组中的元素要使用下标来索引,下标可以是整数或者算术表达式,其值应该大于或等于0.

定义数组
在shell中,用括号来表示数组,数组元素中用“空格”符号分隔开。定义数组的一般形式为:
数组名=(值1 值2 ... 值n)

例如:
array_name=(value0 value1 value2)

或者:
array_name=(
value0
value1
value2
)


还可以单独定义数组的各个分量:
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2

可以不使用连续的下标,而且下标的范围没有限制。

读取数组
读取数组元素值的一般格式是:
${数组名[下标]}

例如:
valuen=${array_name[n]}


使用@符号可以获取数组中的所有元素,例如:
echo ${array_name[@]}

获取数组的长度
获取数组长度的方法如下:
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
length=${#array_name[n]}


同样,知道了数组元素的个数和数组单个元素的长度后,就可以知道所占据内存的大小了。




你可能感兴趣的:(Shell,Script)