Shell基础知识
1、简介
Shell 是一个用 C 语言编写的程序。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是一个命令解释器。位于操作系统和应用程序(人)之间,是一个接口,Shell 负责把应用程序的输入命令信息解释给操作系统,将操作系统指令处理后的结果解释给应用程序。shell就是在操作系统和应用程序之间的一个命令翻译工具。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Shell 脚本(shell script),是一种为 shell 编写的脚本程序,Shell 和 Shell 脚本是两个不同的概念
Shell环境:
- Bourne Shell(/usr/bin/sh或/bin/sh)
- Bourne Again Shell(/bin/bash)
- C Shell(/usr/bin/csh)
- K Shell(/usr/bin/ksh)
- Shell for Root(/sbin/sh)
在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。
#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。
分类:
- 图形界面shell:桌面
- 命令行式shell:windows系统:cmd.exe 命令提示字符 linux系统:sh / csh / ksh / bash / …
我们常说的shell是命令行式的shell,在工作中常用的是linux系统下的bash。
| shell命令 | 说明 |
|---|---|
echo $SHELL | 查看当前系统的shell类型 |
cat /etc/shells | 查看当前系统环境支持的shell |
chsh <用户名> -s <新shell> | 更改默认的shell |
使用方式
| 方式 | 作用 | 特点 |
|---|---|---|
| 手工方式 | 手工敲击键盘,在shell的命令行输入命令,按Enter后,执行通过键盘输入的命令,然后shell返回并显示命令执行的结果. | 逐行输入命令、逐行进行确认执行 |
| 脚本方式 | 就是说我们把手工执行的命令a,写到一个脚本文件b中,然后通过执行脚本b,达到执行命令a的效果. 当可执行的Linux命令或语句不在命令行状态下执行,而是通过一个文件执行时,我们称文件为shell脚本。 | 执行文件达到批量执行命令的效果 |
运行Shell脚本的方法
(1)source方式 | ./ (作为可执行程序)
source方式可以使环境变量生效
chmod +x ./test.sh #使脚本具有执行权限 ./test.sh #执行脚本
说明:linux的默认搜索目录里没有当前目录,不写./linux系统会去 PATCH 里寻找有没有 test.sh,用./告诉系统就在当前目录找
(2)作为解释器参数(推荐使用)
这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:
/bin/bash test.sh /bin/php test.php
(3)脚本首行指定解释器
开发规范
1、脚本命名要有意义,文件后缀是.sh
2、脚本文件首行**是而且必须是**脚本解释器
#!/bin/bash
3、脚本文件解释器后面要有脚本的基本信息等内容
脚本文件中尽量不用中文注释;
尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰
常见的注释信息:脚本名称、脚本功能描述、脚本版本、脚本作者、联系方式等
4、脚本文件常见执行方式:bash 脚本名
5、脚本内容执行:从上到下,依次执行
6、代码书写优秀习惯;
1)成对内容的一次性写出来,**防止遗漏**。
如:()、{}、[]、''、``、""
2)[]中括号两端要有空格,书写时即可留出空格[ ],然后再退格书写内容。
3)流程控制语句一次性书写完,再添加内容
7、通过缩进让代码易读;(即该有空格的地方就要有空格)
二、变量
shell 脚本的变量都是字符类型
分类
| 分类 | 作用 |
|---|---|
| 本地变量 | 变量名仅仅在当前终端有效 |
| 全局变量 | 变量名在当前操作系统的所有终端都有效 |
| shell内置变量 | shell解析器内部的一些功能参数变量 |
1、本地变量
本地变量就是:在当前系统的某个环境下才能生效的变量,作用范围小。
本地变量包含两种:
- 普通变量
- 命令变量
表现样式
普通变量定义
| 类型 | 样式 | 特点 |
|---|---|---|
| 无引号 | 变量名=变量名 | 变量值必须是一个整体,中间没有特殊字符,"="前后没有空格 |
| 单引号 | 变量名=‘变量值’ | 原字符输出 |
| 双引号 | 变量名=“变量值” | 变量值先解析,后整合输出 |
习惯:数字不加引号,其他默认加双引号;
命令变量定义
| 类型 | 样式 | 特点 |
|---|---|---|
| 反引号 | 变量名=命令 | 反引号 |
| 小括号 | 变量名=$(命令) | $() |
执行流程:
- 执行
xx或者$()范围内的命令 - 将命令执行后的结果,赋值给新的变量名
2、环境变量(全局变量)
在当前系统的所有环境下都能生效的变量,可以基于env命令查看
表现样式
export 变量=值
3、内置变量
| 符号 | 意义 |
|---|---|
| $0 | 获取当前脚本文件名 |
| $n | 获取脚本的第n个参数值 |
| $# | 获取脚本参数的总个数 |
| $? | 获取上一个指令的状态返回值(0为成功,非0为失败) |
变量操作
查看 $变量名、"$变量名"、${变量名}、"${变量名}" 取消 unset 变量名
4、变量计算
shell 脚本的变量都是字符类型,但也支持简单的整数运算
# 1、let let n3=n1+n2 # 2、$(())语法 n3=$((n1+n2))
三、表达式
1、条件表达式
条件的结果无非就是成立或者不成立,而我们之前所学的$?就可以表示,判断条件是否成立的过程我们称为条件判断,一般有两种表现形式:
- test 条件表达式
- [ 条件表达式 ]
格式注意:
- 后者需要注意方括号[ ]与条件表达式之间至少有一个空格。
- 条件成立,状态返回值是0;条件不成立,状态返回值是1
2、逻辑表达式
| 符号 | 样式 | 作用 |
|---|---|---|
| && | 命令1 && 命令2 | 只有1成功,2才执行 |
| ll | 命令1 ll 命令2 | 1和2只能执行一个 |
3、文件表达式
| 符号 | 样式 | 作用 |
|---|---|---|
| -f | -f file_name | 判断普通文件 |
| -d | -d file_name | 判断目录 |
| -s | -s file_name | 判断链接文件 |
| -r | -x file_name | 判断读 |
| -w | -w file_name | 判断写 |
| -x | -x file_name | 判断执行 |
4、一般表达式
| 数字 | 样式 | 特点 |
|---|---|---|
| eq、ne | 数字1 eq 数字2 | 相等eq,不等ne |
| gt、lt | 数字1 gt 数字2 | gt大于,小于lt |
| 字符串 | 样式 | 特点 |
|---|---|---|
| ==、!= | str1 == str2 | 字符串内容是否一致 |
| -z、-n | -z str1 | z空,n不空 |
注意:在字符串表达式中,"==" 可以简写为 “=”, 但是不推荐。
四、常见符号
1、重定向符号
| 符号 | 说明 | 作用 |
|---|---|---|
| > | 重定向 | 表示将符号左侧的内容,以覆盖的方式输入到右侧文件 |
| < | 重定向 | 表示将符号左侧的内容,以覆盖的方式输入到左侧文件 |
| l | 管道符 | 常用于将两个命令隔开,然后命令间(从左向右)传递信息使用的 |
| & | 后台展示 | 就是将一个命令从前台转到后台执行 |
| 1 2 2>&1 | 信息获取 | 1:表示正确输出的信息 2:表示错误输出的信息 2>&1:代表所有输出的信息,也可以简写为 &> |
脚本实例
#!/bin/bash echo '下一条错误命令' dsfsafsafdsa
执行效果
bash ceshi.sh bash ceshi.sh 1>> ceshi-ok 2>> ceshi-err cat ceshi-ok ceshi-err bash ceshi.sh >> ceshi-all 2>&1 cat ceshi-all
浙公网安备 33010602011771号