为什么用shell脚本编程?
helloword示例
脚本程序的后缀一般以.sh结尾,但是不是强制的。
脚本程序的第一行以#!开头 然后加上当前脚本的解释器。
echo相当于C语言的printf!
如何执行?
正确写法如下:
方法1:
方法2:
这两种方法本质上是一样的。
编译型和解释型
解释型:运行需要解释器,效率相对低一些。PHP,Python就是解释型。
编译型:需要编译链接生成可执行程序。main.c->main.exe。C/C++/Go语言就是编译型。
java有编译型的特点也有解释型的特点。Java需要解释器:Java虚拟机。Java虚拟机不能跨平台。Java的代码经过Java的编译器生成.class文件,文件格式是固定的,被java虚拟机执行。在Windows上安装的虚拟机可以执行.class文件,在Linux上安装的虚拟机可以执行.class文件。执行效率不如C/C++,因为C/C++直接执行在主机上。而java执行和主机隔着Java虚拟机。性能比C/C++低。但是Java的优势是有Java虚拟机,把底层硬件,操作系统与用户层面代码隔离开,可以把热点代码转换为本地代码,但是这就无法跨平台了。
变量
我们的变量是没有类型的!
本地变量,环境变量,参数变量
#是屏蔽的作用!
本地变量(用户自己定义的变量)
我们可以把100看成数字也可以看成是字符串。
变量名=变量值 注意:中间不能有空格,是紧密相连的!!!
赋值=的左边,右边不能有空格!!!
$变量名:取变量的值。
这里的双引号是弱引用,里面的 $可以取变量的值。
如果只有一个hello,可加可不加双引号,但是hello word中间有空格,必须加双引号才可以。不然只能会把空格前的字符串赋值进去。
如果有单引号呢?(类似于C语言的双引号作字符串)
可以通过另一个变量来赋值这个变量
从键盘获取值 (read)
脚本中的一个变量可以表示很多类型
环境变量(从父进程继承来的,我们没有定义但是可以使用)
$0:脚本的名字
$#:脚本的参数个数
$$ :脚本的pid,实际上就是解释器的pid。
参数变量
$ 1就是第一个变量,$ 2就是第二个变量, $ 9 就是第九个变量,只能传9个参数。用$ *传全部参数。
\是转义的作用。
条件
除了给变量赋值不能有空格,其他的书写都要空格!!!
if写法1:
if写法2:
加上双引号,防止空值
判空操作
if else
else if
从键盘输入成绩的应用例子
for循环
一般情况下,for后面给个命令
运行结果和我们想象的不一样!!!
怎么改?
加个双引号也没事!
但是这样就 错了
但是对变量双引号就没事
下面这种方法也可以
i++的操作
下面这个写法也可以
但是 a+1就是错误的
while循环
死循环的写法
示例:
从键盘输入密码(只能输3次)
until循环
条件为假 进入循环
函数
没有主函数,即使有mian,也是和其他函数同等地位。
第15行执行。
函数的变量
函数的返回
下面这种写法是错误的
正确的写法如下:
$?代表获取上一行代码的执行结果
这里要用变量去接收$ ?,因为$?会一直变,接收上一行代码的结果。
这种写法只适合当下,后面再用就不行了
脚本的特点
我们每次定义变量,谁在执行,bash在执行,变量在解释器里,除非移除
虽然你是函数,但是你告诉解释器你定义了一个变量,初始化,bash解释器帮你定义一个变量,执行完,这个变量还在的!!!在函数体内外都可以访问
unset是移除
加上local,代表这个变量只在这个函数里用一下
local后return还是可以拿到