(一)解释型语言
解释一行执行一行,比较灵活,但是效率会比编译型语言©低一点。
需要先新建、赋予执行权限
#!/bin/bash 指的是当前默认命令行的解释器bash
脚本的常用执行方式
(1)bash +相对/绝对路径/xxx.sh 在使用时往往不使用这种方式
(2)使用绝对/相对路径执行脚本,需要chmod +x xx.sh 赋予可执行权限。
(3)子在脚本的路径前面使用. 或者source命令。如.+空格 xxx.sh source xxx.sh
第一3种方式是单独的使用了一个bash命令的进程,从而进行了脚本的解析。
第二种方式是用当前的bash环境去执行这个脚本,所以也需要有可执行权限。
第三种方法是用的点命令和source命令,直接执行当前环境shell命令,前两种方式都是相当于打开一个子shell去执行,这样容易造成环境变量获取不到,而用这个命令就不会造成这个现象。
开子shell和不开子shell的区别在于,环境变量的继承关系,如在子shell中设置的当前变量,父shell是不可见的。
使用ps -f 查看是否进入子shell
exit 退出子shell
(二)变量
可分为系统预定义变量和自定义变量,也可以分为全局和局部。也可以分分乳如下。
(1)系统预定义变量
1.常用系统变量
$HOME $PWD $SHELL $USER
env 查看系统
set 查看所有变量,是所有的,包括全局和局部、自定义和系统定义。
(2)自定义变量
赋值时等号两边不能有空格。
使用export将局部变量导出升为全局变量。
1.只读变量
只能读不能写,使用readonly定义
2.撤销变量,使用unset 变量名,只读变量不能unset
(3)特殊变量
- $n
n为数字,$0代表该脚本名称,$1- 9 代 表 第 一 个 到 第 九 个 参 数 , 十 个 以 上 的 参 数 需 要 用 大 括 号 表 示 , 如 9 代表第一个到第九个参数,十个以上的参数需要用大括号表示,如 9代表第一个到第九个参数,十个以上的参数需要用大括号表示,如{10} - $#
获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性。 - $* $@
∗ 这 个 变 量 代 表 命 令 行 中 所 有 的 参 数 , * 这个变量代表命令行中所有的参数, ∗这个变量代表命令行中所有的参数,*把所有的参数看成一个整体。
@ 作 用 和 前 者 一 致 , 只 不 过 这 个 把 每 个 参 数 区 别 对 待 。 4. @ 作用和前者一致,只不过这个把每个参数区别对待。 4. @作用和前者一致,只不过这个把每个参数区别对待。4.?
最后一次执行的命令的返回状态,如果这个变量的值为0,证明上一个命令正确执行。如果这个变量的值为非0,证明上一个命令执行不正确。
(三)运算符
(1)普通运算符
expr 1 + 2 将1和2当作参数传进去
expr 5 * 2 将乘号转义
在shell为了简化,使用 ( ( ) ) 或 者 (()) 或者 (())或者[]
a= ( ( 1 + 2 ) ) 命 令 替 换 a = ((1+2)) 命令替换 a= ((1+2))命令替换a=(命令a) 将命令a的结果赋值给a
也可以使用 a=命令a
来赋值
输出键盘输入的两个参数的和
sum = $($1+$2)
echo $sum
(2)判断
test 表达式,如果正确为真,错误为假,使用echo $? 正确返回0
a=hello
test $a = hello
echo $? 这里为真 返回0
使用[ $a = hello ]可以等价替代test,前括号后面空格 后括号前面空格 等号前后空格。
(3)常用判断条件
1.两个整数之间的比较
-eq 等于(equal) -ne 不等于(not equal)
-lt 小于(less than)-le 小于等于(less equal)
-gt 大于 (greater than) -ge 大于等于(greater equal)
如果是字符串之间的比较,用等号判断相等,用!= 判断不等。 - 按照文件权限进行判断
-r 判断文件是否有读的权限
-w 有些的权限
-x 有执行的权限
[ -r hello.sh ]
5.按照文件类型进行判断
-e 文件存在
-f 文件存在且是一个常规的文件(file)
-d 文件存在且是一个目录(directory)
[-e /home/info]
6.多条件判断
&& 表示前一条命令执行成功时,才执行后一条命令,||表示上一个命令执行失败后,才执行下一条命令。
[] && []. => [xxx. -a xxxx ]
[] || [] => [xxx -o xxxx ]
(四)流程控制
1.if 判断
(1)单分支
if [条件表达式];then
程序
fi
或者
if [ 条件判断式]
then
程序
fi
(2)双分支
if []
then
程序
else
程序
fi
(3)多分支
if []
then
程序
elif []
then
程序
else
程序
fi
2.case语句
case $变量名 in
“值1”)
如果变量的值等于值1,则执行程序1
;;
“值2”)
如果变量的值等于值2,则执行程序2
;;
…省略其他分支
*)
如果变量的值都不是以上的值,则执行此程序。
;;
esac
注意事项:
(1)case行尾必须为单词 in,每一个模式匹配必须以右括号结束。
(2)双分号“;;” 表示命令序列结束,相当于jaca中的break。
(3)最后的 *)表示为默认模式,相当于java中的default。
3.for循环
(1)
for((初始值;循环控制条件;变量变化))
do
程序
done
(2)增强for循环
for 变量 in 值1 值2 值3·····
do
程序
done
$*把所有的参数看成一个整体
@ 把 所 有 的 参 数 区 别 对 待 。 在 s h e l l 中 如 果 不 把 这 两 个 用 引 号 引 起 来 , 效 果 是 一 样 的 , 用 双 引 号 引 起 的 来 话 会 有 不 同 的 效 果 , @把所有的参数区别对待。 在shell中如果不把这两个用引号引起来,效果是一样的,用双引号引起的来话会有不同的效果, @把所有的参数区别对待。在shell中如果不把这两个用引号引起来,效果是一样的,用双引号引起的来话会有不同的效果,*会把列表看成一个整体,是一个元素。
4.while循环
while []
do
程序
done
(五) read 读取控制台的输入
(1)基本语法
read (选项) (参数)
选项:
-p 指定读取时的提示符
-t 指定读取时等待饿时间(s) 如果-t不加就会一直等待。
参数:
变量: 指定读取值的变量名
(六) 函数
(1)自定义函数
[function] funname[()]
{
}