在本书中,我们将shell的基本语法分为5块:变量、运算符、条件、循环、函数(其实任何程序语言都可以说是由这几块组成)。
本节内容就分别简短地介绍下Shell的基本语法,有其他语言经验的读者们可能会更好理解。
没有其他语言经验的多写几个Shell脚本也就理解了。
1.变量是什么?
顾名思义,变量通常是可变的。在计算机程序语言中,这是第一个需要了解的概念。
简单来说,在数学上它是计算公式中的x,在物理上它是一个内存空间。
在声明变量时,相当于在计算机内存中,开辟了一个地方,存放了这个变量符号。
它会不断地被赋值,每被赋值一次,之前的值就会被清空,它的内部就保存了现在这个值的数据。
2.变量赋值
赋值示例:
- war_name=yaomm ## 赋值yaomm这个数据给了war_name这个变量
变量的赋值规则:
- 变量名和等号之间不能有空格,例如“war_name = yao”。
-
- 命名只能使用英文字母、数字和下划线,首字符不能以数字开头,例如“3war”。
-
- 变量名中间不能有空格,可以使用下划线“_”,例如“war name”。
-
- 变量名不能使用标点符号,如点“.”,例如“.=yaomm”。
-
- 不能使用bash里的关键字(可用help命令查看保留关键字),例如“bash=233”。
3.变量使用示例
- [root@linuxido ~]# var_name=yaomm ## 变量赋值,赋值var_name变量为yaomm
- [root@linuxido ~]# echo ${var_name} ## 使用echo打印变量,变量以【${}】方式引用
- yaomm
- [root@linuxido ~]# echo $var_name ## 也可以使用【$ + 变量名】输出变量值
- yaomm
- [root@linuxido ~]# echo "var_name is $var_name" ## ==> 变量可以在双引号中被引用
- var_name is yaomm
${var_name}与$var_name的区别是:被花括号包围的变量不会产生歧义。
例如有一个变量名为var_nameexe的值是23,此时echo $var_nameexe 应打印什么值?
4.变量传参
什么是变量传参?
即在编写脚本时预留一个变量,然后由外部传递进来一个具体的值给这个变量。
示例如下:
- [root@linuxido shell]# cat 001.sh ## 查看使用【vi 001.sh】编辑的第一个脚本
- #!/bin/bash
- # author:姚毛毛的博客
-
- echo "Shell 传递参数实例!"
- echo '第一个参数${1}:' ${1}
- echo '第二个参数$2:' $2
- echo '参数个数$#:' $#
- echo '所有参数作为一个字符串显示$*:' $*
- echo '所有参数合为数组$@:' $@
- echo '当前脚本进程号PID:' $$
-
- [root@linuxido shell]# sh 001.sh yaomm 666 ## 执行001.sh,参数有2个:yaomm、666
- Shell 传递参数实例!
- 第一个参数$1:yaomm
- 第二个参数$2:666
- 参数个数$#:2
- 所有参数作为一个字符串显示$*:yaomm 666
- 所有参数合为数组$@:yaomm 666
- 当前脚本进程号PID:65134
参数传递规则:
- $0:脚本自身文件名。
-
- $#:传递到脚本的参数个数。
-
- $n:传递到脚本的第一个参数,n为传递参数的顺序。
-
- $*:所有参数合成一个字符串。
-
- $@:所有参数,一个数组。
-
- $$:当前脚本运行的进程号PID。
-
- $?:上一个脚本、函数返回结果。
要执行的脚本为全路径时,使用$0会获取到脚本路径,如果只想取脚本路径或者脚本名称,可以使用【dirname】、【basename】这两个命令,如下所示:
- [root@linuxido /shell]# dirname /shell/001.sh ## 获取路径
- /shell
- [root@linuxido /shell]# basename /shell/001.sh ## 获取脚本名称
- 001.sh
5.数组
在Shell中除了普通变量外,还有个数组变量(只支持一维数组)。
与其他语言类似,数组下标从0开始。
不同的是,数组内容要用括号来表示,数组元素之间使用空格分割。
示例如下:
- [root@linuxido shell]# war_array=(y ao "mm" 1987) ## 设置数组元素内容
- [root@linuxido shell]# echo ${war_array[*]} ## 打印所有数组元素
- y ao mm 1987
- [root@linuxido shell]# echo ${war_array[2]} ## 打印第三个数组元素
- mm
- [root@linuxido shell]# echo ${#war_array[@]} ## 数组元素个数
- 4
- [root@linuxido shell]# echo ${#war_array[*]} ## 数组元素个数
- 4
或者使用下标定义数组:
- war_array[0]=y
- war_array[1]=ao
- war_array[2]=’mm’
- war_array[3]=2021