目录
shell脚本
概念
shell的使用方式:手动命令和脚本
shell脚本的本质:shell命令的有序集合,扩展名可以为.sh,也可以没有
shell不仅是一个应用程序还是一种脚本语言
1)编译型语言:c ,java ,c++ ,当中间出错,err直接结束,修改重新编译运行
2)解释型语言:shell python,不需要编译直接执行,当中间出粗偶,智慧在错误的地方报错,但是不会影响后面的内容;解析一条指令,执行一条指令
创建和执行
创建shell脚本:touch test.sh
第一行写:#!/bin/bash
解释: 使用/bin/bash来解释执行
变量
用户自定义变量
一般用大写,进行赋值时用=,左右两边不能有空格
引用变量前面加$
位置变量
$0 与输入的命令行一样,包含运行的脚本的名字 xx.sh
$1 , $2 .... $9 分别包含第一个到第九个命令行参数
$# 命令行参数的个数,不包含脚本文件
$@ 所有命令行参数
$* 所有命令行参数
预定义变量
$?前一个命令的退出状态(0为真,非零为假)
$$正在运行进程的ID号
功能语句
说明性语句
以#开头
注释用#
功能性语句
1.read
功能:read从标准输入读入一行,并赋值给后面的变量
格式: read VAR1 VAR2 VAR3
读入行的第一个单词赋值给var1 ,第二个单词赋值给var2,..其余所有都赋值给最后一个变量
read -p "提示语句" 变量名 : 可以将提示语句输出,同时输入变量
2.expr
格式:expr 表达式
算术运算符命令expr主要用于简单的整数运算, 加(+),减(-)乘( \*) 除 (/)取余 (%)
注意:
(1)表达式符号之间必须用空格间隔
(2)expr引用变量必须$
(3)expr自带打印功能
(4)使用乘号\* 小括号\( \) 需要转义
(5)把expr的结果赋值给变量需要命令置换符
(6)expr不能进行++ -- 操作
3.let
格式:let 表达式
(1)运算的时候运算符左右两边不能有空格
(2)不能自己打印,输出需要用echo
(3)let语句可以不加$引用变量
(4)let n=n**2 表示平方
(5)5.可以++ -- ,()转义,*不转义
4.test
可以测试三种对象:字符串 整数 文件属性
1.字符串测试
s1 = s2 测试两个字符串是否完全一样
s1 != s2 测试两个字符串是否有差异
-z s1 测试s1长度是否为0
-n s1 测试s1长度是否不为0
2.整数的测试
$a -eq $b 测试a与b是否相等 equal
$a -ne $b 测试a与b是否不相等 not equal
$a -gt $b 测试a是否大于b greater than
$a -ge $b 测试a是否大于等于b
$a -lt $b 测试a是否小于b less than
$a -le $b 测试a是否小于等于b
3.文件属性测试
测试name 是否为一个目录 -d name
测试name 是否为一个普通文件 -f name
测试name 是否存在 -e name
结构性语句
if语句
1.基本结构
if 判断条件
then
命令表1
else
命令表2fi
2.分层结构
if 判断条件1
then
命令表1
elif 条件2
then
命令表2
else
命令表3
fi
3.嵌套结构
if 条件
then
if 条件
then
命令表1
else
命令表2
fi
else
命令表2
fi
注意:
if 和 fi是条件语句的括号,必须成对使用
命令表中的命令可以一条也可以多条
case语句
case 变量 in
模式1)
命令表1
;;
模式2)
命令表2
;;...
*)
命令表n
;;
esac
注意:
1)case语句只能检测字符串变量
2)命令表以单独的;;结束,退出case语句
3)模式n通常写为*,表示其他所有的模式
4)case匹配项中可以存在多个模式,每种模式之间|隔开
for循环
for 变量名 in 单词表
do
命令表
done
变量依次从单词表中读取各个单词,每取一次单词,就执行一次循环体中的命令表,循环次数由单词表中的单词数决定,命令表中的命令可以一条,也可以是由分号或换行符分隔开的多条。
for语句书写格式:
for i in 1 2 3 4 5
do...
done
变量i从单词表中取值
for i
do
...
done
变量i从命令行取值,可以省略in 单词表
for i in {1..10}
do
...
done
变量i从1-10取值
for ((i=0;i<10;i++))
do
...
done
书写格式类似于c语言
while
while 命令或表达式
do
命令表
done
while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。
循环控制语句
break n 结束n层循环
continue n 结束n层本次循环,继续外层循环