1、shell脚本是什么?
脚本是由一系列的shell命令组合起来,并且加入一定的控制语句之后形成的一个文本,就可以称为脚本。脚本最大的优点就是可以去代替人工去重复的执行某件事情。当执行脚本的时候,shell解释器就会逐行去翻译命令,并将结果提交给内核,内核接收到结果之后,就会去驱动硬件进行响应,因此脚本就是一门解释型的语言,本质是多条shell命令的有序集合(可能会加入一定量的控制结构语句)。
2、脚本的编写格式及步骤
1)创建一个.sh文件(后缀为.sh的文件一般就是shell脚本文件)
2)打开.sh文件(vim编辑),首行输入引用 #! /bin/bash(相当于引用bash为内核来解释你编写的脚本)
3)按照规定的语法进行编写
4)编写完成后保存,并且给.sh文件加可执行权限(chmod u+x 文件名.sh)
5)./文件名.sh(执行脚本)
3、脚本的语法
1)脚本中变量的定义:脚本中的所有数据类型称为“弱类型”,及在脚本编写过程中,所有的变量没有数据类型的区分。
2)自定义变量
定义方法: 变量名 (只需写变量名就好,建议大写)
变量赋值: 变量名=值 (等号前后不能有空格,紧挨着写)
引用: &{变量名} 或 &变量名 (带大括号比较安全,不带大括号的话如果变量后还有字符,则会不识别变量,会认为是个新的变量名,建议带大括号,这样不容易出错)
3)位置变量
概念:变量的值可以从命令行传入。
使用:命令行输入 ./test.sh 5 10
#! /bin/bash
#位置变量为 $N(N是数字,从0开始)
echo $1
则会打印5,$0为./test.sh,当然$2就为10
4)系统预定义变量
概念:系统之前规定将$符号和指定的另外一个字母两者相结合,之后具备一定的含义。
$#:统计命令行参数的个数(有效参数的个数,不包含可执行文件的名字,及不包含上方中的$0,从下一个有效的参数开始,执行语句默认无效)
$@:统计传入的参数本身(也是有效参数)
$*:统计传入的参数本身(也是有效参数,用法与$@差不多)
$?:获取上一条命令的退出状态:状态数值不是0就是1(0代表上一条命令时成功执行,反之为失败执行)
5)环境变量
查看系统中的所有环境变量的shell命令:env
操作:
添加新环境变量:
export 变量名=值 (可以一次性赋值多个,多个数值之间以冒号隔开)
修改环境变量值:
export 变量名=新值:${变量名} (想在旧变量之前加参数)
export 变量名=${变量名} :新值 (想在旧变量之后加参数)
清除环境变量:
unset 变量名
!!!当然环境变量谨慎修改!!!
4、脚本的语句
1)说明性语句
凡是以#开头的语句都是说明性语句,可以理解为注释。
2)功能性语句
2-1动态获取变量的值
命令:read,读取键盘输入的值,功能类似于C语言中的scanf函数的功能
方式:
read 变量名1 变量名2 。。。 变量名 (若变量未定义,则默认定义新变量且赋初值)
提示语句的写法:
- 方式1:通过echo “提示语句”
- 方式2:使用read的同时去打印:read -p“提示语句” 变量名
#! /bin/bash
#方法一
echo "请输入二个值:"
read NUM1 NUM2
#方法二
read -p "请输入两个值" NUM3 NUM4
2-2通配符的转义
通配符的解释:大概理解就是通用的字符,可以代替任意字符
1、软转义
在这块即了解双引号加与不加的区别,在大多时候,两者其实没有多大的区别,但是又不完全相同,举例如下
#! /bin/bash
#举例1
echo "河流 77"
#举例2
echo 河流 77
举例一的输出结果即为 河流 77
举例二的输出结果即为 河流 77
若不加双引号则会将多个空格缩减为一个空格,反之则会将空格原样输出
2、硬转义
单引号 与 ”\“ 称为硬转义,在打印输出时,硬转义符号遇到变量${变量名}或者命令时,不会去把他们当作变量和命令。而是当作一个字符串去输出。
2-3 expr算术运算命令
功能:实现加、减、乘、除、取余
使用方法:
expr 变量名1 运算符 变量名2(其中每个字段之间至少需要保留一个空格)
2-4测试命令test
功能:代替判断语句,例如C语言中的if
测试格式
1、[(空格)对象一 测试条件 对象二(空格)] (中括号和两个对象之间必须至少有一个空格)
2、test 对象1 测试条件 对象2
1、对于整型的测试(测试对象假设为${num1} 、${num2})
#! /bin/bash
#等于
test ${num1} -eq ${num2}
#不等于
test ${num1} -ne ${num2}
#大于
test ${num1} -gt ${num2}
#大于等于
test ${num1} -ge ${num2}
#小于
test ${num1} -lt ${num2}
#小于等于
test ${num1} -le ${num2}
2、对于字符串的测试(测试对象假设为${str1} 、${str2})
#! /bin/bash
#等于
[ ${str1} = ${str2} ]
#不等于
[ ${str1} != ${str2} ]
#字符串长度为0
[ -z ${str1} ]
#字符串长度不为0
[ -n ${str2} ]
3、对于文件属性的测试(测试对象假设为${f1} 、${f2})
#! /bin/bash
#-f :测试对象是否存在且为普通文件
[ -f ${f1} ]
#-d :测试对象是否存在且为目录文件
[ -d ${f1} ]
#-L :测试对象是否存在且为软链接文件(符号链接文件)
[ -L ${f1} ]
#-r:测试对象是否存在且具备可读权限
[ -r ${f1} ]
#-w:测试对象是否存在且具备可写权限
[ -w ${f1} ]
#-x:测试对象是否存在且具备可执行权限
[ -x ${f1} ]
#-s:测试对象的大小
[ -s ${f1} ]
#f1 -nt f2:测试f1是否比f2更新(文件最后一次保存的时间)
[ f1 -nt f2 ]
#f1 -ot f2:测试f1是否比f2更旧(文件最后一次保存的时间)
test f1 -ot f2
5、结构性语句
一般主要分为,顺序结构、选择结构、循环结构
1、选择结构
(1)if语句
#if语句的使用
#if多路分支
if 测试语句
then
命令表
elif 测试语句
then
命令表
else
命令表
fi
(2)case语句
#case的使用
case 变量值 in
模式1)
命令表
;;
模式2)
命令表
;;
模式3)
命令表
;;
*)
命令表
esac
6、循环结构
1、for循环(两种风格都可以使用)
#sehll风格
for 变量名 in 参数列表
do
命令1
命令2
...
命令N
done
#类似C风格
for(i = 0 ; i< 10 ; i++)
{
命令表
}
2、while循环
#while循环的使用
while 条件判断
do
命令表
done
#while死循环
while [ true ]
do
命令表
done
版权归原作者 河流77 所有, 如有侵权,请联系我们删除。