Shell编程基础
一个脚本必然需要通过很多手段操控它的运行,而无论什么操控手段,都离不开变量。从变量的实质来说,变量名是指向一片用于存储数据的内存空间。Shell语法的变量有几个特点:
- 弱类型
- 无需事先声明
# 变量
# 1、局部变量
只在某个Shell中生效的变量,随着当前Shell的消失而消失,可以使用local内建命令来“显式”的声明局部变量,但仅限于函数内使用。
# 2、环境变量
环境变量,又称“全局变量”。可以使用export内建命令将其导出为环境变量
。环境变量在当前环境和子Shell环境中生效,“传子不传父”。
[root@fanxin sbin] export VAR=value //将当前变量VAR导出为环境变量,所以其子shell、孙子shell都可以使用VAR的值
# 3、变量命名
强制规定:
- 以字母或者下划线开头
- 后面可以跟数字、字母和下划线
- 变量长度无限制
- 严格区分大小写
以下非必须,程序员的自我修养:
- 见名知意
- 增加一些清晰明了的注释
# 4、变量的赋值和取值
定义变量:变量名=变量值
注意事项:
1、等号两侧不能有空格;
2、变量值中有空格时要用引号括起 ==> eg: name="Xin Fan"
变量取值:$变量名
注意事项:
1、使用${变量名} 的取值方法最保险
2、变量引用其它变量,必须使用双引号,单引号会阻止Shell解释特殊字符$
3、使用 shopt -s -o nounset ,设置脚本遵循”先声明后使用“原则,防止不正当引用未声明变量但是没有错误提示。
# 5、取消变量
取消变量:unset 变量名||函数名
将变量或者函数从内存中释放。
# 6、特殊变量
- 位置参数
$0
:脚本名本身。$1、$2……${10}:脚本的第一个参数、第二个参数……第十个参数。
$#
:变量总数。
$*
、$@
:显示所有参数。
$?
:前一个命令的退出的返回值。
$!
:最后一个后台进程的ID号。
- 脚本或命令返回值:$?
Linux中规定正常退出的命令和脚本应该以0作为其返回值
,任何非0的返回值都表示命令未正确退出或未正常执行
。
[root@fanxin sbin]# ifconfi //故意输入错误的指令
-bash: ifconfi: 未找到命令
[root@fanxin sbin]# echo $? //使用 $? 查看命令的返回值
127 //返回值不为0,说明命令未正常执行
## ---------使用正确的命令------------
[root@fanxin sbin]# ping github.com -c 1
PING github.com (13.250.177.223) 56(84) bytes of data.
64 bytes from ec2-13-250-177-223.ap-southeast-1.compute.amazonaws.com (13.250.177.223): icmp_seq=1 ttl=40 time=160 ms
--- github.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 160.787/160.787/160.787/0.000 ms
[root@fanxin sbin]# echo $? //使用 $? 查看命令的返回值
0 //返回值为0,说明命令正常执行
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 7、数组(重点)
- 数组的定义
声明方式: declare-a 数组名
//通过 declare 关键字来声明一个数组
赋值方式: 数组名[0]=值
//通过数组名[下标从0开始]的形式进行赋值
声明+赋值: 数组名=('值1','值2','值3') //不适用declare关键字,创建数组并直接赋值
- 数组操作
数组取值 | 数组长度 | 数组截取 | 连接数组 | 替换元素 | 取消数组 |
---|---|---|---|---|---|
${数组名[索引]} | ${#数组名[@或*]} | ${数组名[@]:1:2} | (${数组1[@]} ${数组2[@]}) | (${数组[@]/a/b}) | unset 数组名||数组[索引] |