一、shell入门
1.1 编写规范
代码规范:
#!/bin/bash [指定告知系统当前这个脚本要使用的shell解释器]
Shell相关指令
文件命名规范:
文件名.sh .sh是linux下bash shell 的默认后缀
1.2 使用流程
1,创建.sh文件:touch/vim
2,编写shell代码
3,执行shell脚本 脚本必须得有执行权限
1.3 入门案例1
案例:创建test.sh,实现第一个shell脚本程序,输出hello world.
- 输出命令:#echo 输出内容
- 注意:输出的内容如果包含字母和符号(不包含变量),则需要用引号包括起来。如果是纯数字可以包也可以不包。
- 脚本内容
- 执行结果
- 注意,这里在运行时一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,Linux 系统会去 PATH(环境变量) 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。
1.4 入门案例2
案例:使用root用户帐号创建并执行test2.sh,实现创建一个shelltest用户,并在其家目录中新建文件try.html。
- 脚本内容
- 执行脚本
脚本执行的另外一个方式:/bin/bash 脚本的路径(了解)
Shell脚本分为简单的写法(简单命令的堆积)和复杂写法(程序的设计)
二、shell变量
2.1 变量概述
1. 变量的定义与使用
定义形如:class_name="yunwe "
使用形如:echo $class_name
变量就是由2部分组成,一个是变量名(左边),另外一部分是变量的值(右边)
在使用变量的时候一定需要在变量名前面添加一个$符号。
2.变量名的规范
注意,变量名后面的等号左右不能有空格,这可能和你熟悉的所有编程语言都不一样。
同时,变量名的命名须遵循如下规则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线“_”。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
2.2 变量案例1
案例:使用变量改写入门脚本中的第1个shell脚本
- 脚本
- 执行结果
- 关于单双引号的问题:
双引号能够识别变量,双引号能够实现转义(类似于“*”)
单引号是不能识别变量,只会原样输出,单引号是不能转义的
2.3 变量案例2
案例:定义一个变量,输出当前时间,要求格式为“年-月-日 时:分:秒”。
- 脚本内容
注意:反引号(esc键下方的那个键),当在脚本中需要执行一些指令并且将执行的结果赋给变量的时候需要使用“反引号”。 - 执行结果
2.4 只读变量
- 语法:readonly 变量名
- 案例:定义变量a并且其值为10,随后设置其为只读变量,再去尝试重新赋值:
2.5 接收用户输入变量
- 语法:read -p 提示信息 变量名
- 案例:编写一个脚本test6.sh,要求执行之后提示用户输入文件的名称(路径),然后自动为用户创建该文件
2.6 删除变量
- 语法:unset 变量名
- 案例:定义变量b=20,再输出b的值,随后删除b,最后再输出下b
三、shell条件判断
- 语法一(一个条件)
if condition
then
command1
command2
...
fi
- 语法二(两个条件)
if condition
then
command1
command2
...
else
command
fi
- 语法三(多个条件)
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
四、shell运算符
4.1 算数运算符
下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:
注意:条件表达式要放在方括号之间,并且要有空格,例如: [
a
=
=
a==
a==b] 是错误的,必须写成 [ $a == $b ]。
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):
#!/bin/bash
val=`expr 2 + 2`
echo "两数之和为 : $val"
两点注意:
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
4.2 关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
-eq:equal
-ne:not equal
-gt:great than
-lt:less than
-ge:great than or equal
-le:less than or equal
4.3 逻辑运算符
下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:
4.4 字符串运算符
下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:
4.5 文件测试运算符
文件测试运算符用于检测 Unix/Linux 文件的各种属性。
属性检测描述如下:
五、shell基本附带选项
5.1 概述
问题描述:在linux shell中如何处理tail -10 access.log这样的命令行选项?
步骤:
- 调用tail指令
- 系统把后续选项传递给tail
- Tail先去打开指定的文件
- 取出最后10行
问题:自己写的shell如何像内置命令一样传递一些选项呢?
#./test.sh a b c
接收:
在脚本中可以用“$1”来表示a,“$2”来表示b,以此类推。
接收可以用“$”加上选项对应的序号即可。
测试:编写test14.sh,传递a,b,c,输出其值
其实$1、$2是变量。
5.2 案例
创建自定义指令“user”,可以直接执行,要求该指令具备以下语法和功能:
a. #user -add 用户名 【添加用户】
b. #user -del 用户名 【删除用户及其家目录】