shell脚本
1)语言分类
高级编程语言主要分为编译型语言和解释型语言
编译型语言
需要把源代码通过编译生成可以执行的文件,才能执行。
编译型语言:
- C、C++、JAVA、Python、C#...
解释型语言
不需要吧源代码编译生成可执行文件的,就可以直接运行的。
解释型语言:
- JavaScript(js) 、 typeScript(ts) 、shell...
如果都是10条语句
- 编译型语言,只有在10条语句都没有语法错的情况下,才能进行编译和运行。
- 解释型语言,哪怕后面9条语句都是错的,都能运行一条。因为它是一条一条语句解析的。
编译型语言:谁来编译?--->编译器
解释型语言:谁来解释?--->解析器
不管是解析器还是编译器都是一个软件。
2)shell解析器/解析程序
- /bin/bash
- /bin/dash
- /bin/sh
可以在写shell脚本的时候去指定使用哪个解析器去解析脚本
3)shell的脚本文件
扩展名: .sh
一个非常简单的shell脚本
demo.sh
#!/bin/bash #指定这个shell脚本使用/bin/bash解析器进行解析
# #开头的是注释
echo "hello shell" # 输出一句话“hello shell”
- #!/bin/bash :指定这个shell脚本使用/bin/bash解析器进行解析
- echo "hello shell" :输出一句话“hello shell”
- echo :一个命令可以将后面的内容输出
4)运行shell脚本
- ./shell脚本名
shell里面的语句可以是可执行的命令
- 命令行所有的可执行命令
- shell自己的语句
注意:如果使用文本编辑器创建shell脚本,需要注意选择unix模式才行。建议大家用vi/vim写 shell
5)shell的变量
shell的变量是没有类型的概念的。
shell的变量不需要进行定义的,直接用。
怎么创建:
- 变量名=值
- 示例: name="zzz" 创建了一个变量 name 并且赋值为 zzz
注意:等号两边不能有空格,等号两边的东西贴贴(贴着等号)
怎么使用:
- $变量名
- 示例: $name 表示引用变量 name 的值
- ${变量名}
- 示例: ${name} 表示引用变量 name 的值
demo2.sh
#!/bin/bash
name="zzz"
echo $name
6)shell变量分类
- 自定义变量
LS=`ls`
LS里面存储的就是ls这个命令执行后输出的结果
反撇号(``) :里面可以写任何可以执行的命令
- 位置变量
- 指的是传递给shell的参数或者是传递给函数的参数
- 示例: ./demo.sh 123 abc
- 在shell里面
- $0 :表示的就是 ./demo.sh 这个参数
- $1 :表示的就是 123 这个参数
- $2 :表示的就是 abc 这个参数
- ... $9
- 注意:最多可以获取9个参数,表示为 $9
- 上述的参数和 main 函数的参数类似
- $# :表示的是参数的个数(不包含 $0 )
- $@ :表示的包含所有命令行的参数 $@ 等价于 "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9"
- $* :表示的包含所有的命令行参数 $* 等价于 "$1 $2 $3 $4 $5 $6 $7 $8 $9"
- $? :表示前面一个命令的退出码(进程退出码,就是 main 函数的返回值、exit(值))
- $? :一个字节,数据保存范围(0~255)
- shell的环境变量
- PATH :保存了可执行文件的默认搜索路径
- HOME :保存了当前用户的家目录的绝对路径
- 以上的变量都是已经定义好了的,可以直接用
总结:
- 赋值:变量名=值
- 引用:$变量名
7)shell的数组
- 创建格式:数组名=(值 值 值 值...)
- 示例: array=(1 2 3 4 5 6 7 8 9) 创建了一个数组并进行赋值
- 注意:shell的数组并不是用花括号{}括起来的。而是用圆括号(),并且里面是用空格分割元 素,不是逗号。
- 引用格式:
- 读引用: ${数组名[下标]} :引用指定与元素
- 示例: ${array[0]}
- ${array} :等同于引用第一个元素
- 示例: ${array}
- 写引用: 数组名[下标]=值
- 示例: array[0]=11
- 引用整个数组: ${数组名[*]} 或者是 $数组名[@]
- 示例: $array[*] 或者是 $array[@]
- 读引用: ${数组名[下标]} :引用指定与元素
8)shell语句
shell文件中的语句可以是
- 命令行所有的可执行命令
- shell自己的语句
read
read:表示从终端输入、接受数据
- read 变量名1 变量名2
重定向语句
- 输入重定向: <
- 命令行的输入请求是通过我们的标准输入设备:键盘...、提交申请
- 我们可以不从键盘获取,可以把这个输入请求重定向到一个文件,这种情况就叫做:输入重定 向
-
read name #从键盘读取一个数据到name里面 #我们可以不从键盘输入,可以将输入重定向 read name < 1.txt #表示从1.txt中获取数据保存到name中
- 输出重定向: > 或者 >>
- 命令的输出通过向我们的标准输出设备(终端)
- 我们可以不输出终端,转而输出到一个文件中,这个就是:输出重定向
-
echo "123" #到终端去了 #我可以不显示在终端 echo "123" > 1.txt echo "123" >> 1.txt
- > :表示情况文件内容,重新写入
- >> :表示从文件末尾增加内容,不会情况,续写
9)expr算术运算语句
用法:
` expr 操作数 运算符 操作数 ` # 注意要有反撇号才可以 ``
示例:
` expr 10 + 20 `
` expr 20 \* 10 ` # 乘法需要进行转义
注意:乘法运算符 * 是一个元字符,需要进行一个转义之后才能表示它自己。
注意:expr是一条命令,如果要获取计算的结果,需要用到反撇号之后,还需要用一个变量接收
10)test测试
可以测试三类对象 :字符串 整数 文件
1.字符串的测试
- = :判断是否相等
- 比较两个字符串是否完全一样,相同为0,不同为1
- 示例: test "abc" = "abc" 对比结果存放在 $?
- 结果为0
- != :判断是否不等
- 比较两个字符串是否不相同,不同为0,相同为1
- 示例: test "abc" != "abc"
- 结果为1
- -z :判断字符串是否为空
- 判断字符串是否为空,为空为0,不为空为1
- 示例: test -z "abc"
- 结果为1
- -n : 判断字符串是否不为空
- 判断字符串是否为空,为空为1,不为空为0
- 示例: test -n "abc"
- 结果为0
2.整数的测试
成立返回0,不成立返回1,结果保存在 $?
- 判断是否相等
- test 操作数1 -eq 操作数2
- equal 测试 操作数1 和 操作数2是否相等
- test 操作数1 -eq 操作数2
- 判断是否不相等
- test 操作数1 -ne 操作数2
- no equal 测试 操作数1 和 操作数2 是否不相等
- test 操作数1 -ne 操作数2
- 判断是否大于
- test 操作数1 -gt 操作数2
- greater than 测试 操作数1 是否大于 操作数2
- test 操作数1 -gt 操作数2
- 判断是否小于
- test 操作数1 -lt 操作数2
- less than 测试 操作数1 是否小于 操作数2
- test 操作数1 -lt 操作数2
- 判断是否大于等于
- test 操作数1 -ge 操作数2
- greater than or equal to 测试 操作数1 是否大于或等于 操作数2
- test 操作数1 -ge 操作数2
- 判断是否小于等于
- test 操作数1 -le 操作数2
- less than or equal to 测试 操作数1 是否小于或等于 操作数2
- test 操作数1 -le 操作数2
11)测试文件
成立返回0,不成立返回1,结果保存在 $?
测试文件的类型
- test -d 文件名 :表示测试这个文件是不是目录
- test -f 文件名 :表示测试这个文件是不是普通文件
- test -L 文件名 :表示测试这个文件是不是链接文件
测试文件的权限
- test -r 文件名 :表示测试这个文件有没有可读权限
- test -w 文件名 :表示测试这个文件有没有可写权限
- test -x 文件名 :表示测试这个文件有没有可执行权限
测试文件的内容
- test -s 文件名 :测试这个文件是否存在并长度是否不为0
- test 文件名1 -nt 文件名2
- -nt : new than/time
- 测试文件1 是否要新于文件2(文件1是不是要比文件2要新)
- test 文件名1 -ot 文件名2
- -ot : old than/time
- 测试文件1 是否要旧于文件2(文件1是不是要比文件2要旧)
注意: test 有一个更简单的写法,可以用 [] 来代替 test 命令
注意:用 [ ] 代替 test 命令需要注意中括号两边和其他参数中间一定一定一定要有空格,需要保持距 离。
12)结构性语句
1.分支语句
语法:
if 命令 ;then
语句块1
elif 命令 ;then
语句块2
else
语句块3
fi
read filename #从终端接收一个文件的名字
#开始判断
if test -f $filename ;then
echo "这是一个普通文件"
else
echo "这是不是一个普通文件"
fi
-----------------------------------
if [ -f $filename ] ; then
echo "这是一个普通文件"
2.多路分支
case 语法:
case 变量 in
情况1)
语句块1
;;
情况2)
语句块2
;;
情况3)
语句块3
;;
...
esac
case 语句和C++中 switch 语句类似, case 的强大之处在于可以使用模糊搜索
模糊搜索/匹配,是指可以使用通配符和正则表达式(支持有限,比如 [] )一般使用 *? ,其实就是去 匹配一个大概。
注意: case 中 ;; 等价于 switch 里面 break ,但是 break 可以省略但是 ;; 不能省略
3.循环语句
for 循环
语法:
for 变量名 in 变量遍历的值
do
循环体语句
done
也可以写成 C/C++ 语法形式
for((表达式1;表达式2;表达式3))
{
循环体语句;
}
while 循环
语法:
while 表达式
do
循环体语句
done
13)shell函数
定义语法:
函数名()
{
函数体语句;
}
注意: shell 函数是不需要参数列表,也不需要返回值,参数传递使用位置变量实现。
示例代码
sum()
{
sum=` expr $1 + $2 `
return $sum
}
函数的调用
函数名 参数1 参数2 参数3 参数4 参数5 ... 参数9
-------
函数名
sum 1 2
注意:函数和外部没有作用域区别的,只要声明过的变量都可以用
注:以上内容均为作者个人见解,若有不正确的地方,还请读者斧正,同时如果对你帮助的话,还请点赞,收藏加关注,你们的支持是我最大的动力!