Shell进阶
1.变量(重点)
1.1变量的含义
在一个脚本周期内,其数可以发生改变的量就是变量
脚本周期:一个脚本周期们可以简单的理解为当前的shell文件
变量是shell中不可或缺的一部分,也是最基础,最重要的组成部分
1.2变量的定义与使用
变量先定义后使用
定义形如:class_name=”python”
使用形如:echo $class_name
变量就是由两部分组成,一个是变量名(左边),另外一部分是变量的值(右边)
变量名和变量是什么关系?
变量名和变量值是使用和被使用关系,我们的变量名来使用变量值
注意:在使用变量的时候一定需要在变量名前添加一个$符号,该要求在其他语言中也存在的。
变量名的规范
注意:变量名后面的等号左右不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
- 名只能使用英文字母,数字和下划线,首个字符不能以数字开头
- 中间不能有空格,可以使用下划线
- 不能使用标点符号
- 不能使用bash里的关键字(可用help命令查看保留关键字)
EG1:使用变量改写入门脚本汇总的第一个shell脚本
注意:
- 关于单双引号,双引号能够识别变量,单引号不能识别变量,只能原样输出
- 双引号能够实现转义,单引号不能实现转义(类似于“\*”)
EG2: 定义一个变量,输出当前时间,要求格式为“年-月-日-时-分-秒”
注意:在脚本中执行一些外部命令并且将执行的结果赋值给变量的时候,需要在命令左右加上反引号(esc下面那个键)
1.3只读变量(了解)
语法:readonly 变量名
EG1:定义变量a并且其值为0,随后设置其为只读变量,再去尝试重新赋值
执行结果:
1.4接受用户输入(重点)
语法:read –p 提示信息 变量名
EG1:便携一个脚本 test6.sh,要求执行后提示用户输入文件的名称(路径),然后自动创建文件
1.5删除变量(了解)
语法:unset 变量名
EG1:定义变量b=20,在输出b的值,随后删除b,最后再输出下b
注解:脚本中有两个打印b的语句,但是执行结果过只有一个,红框下内容为空,因为已经删除b变量了,所以使用空来占行(如果删除后不输出,则再执行的时候没有多余的空行)
2.条件判断语句
语法1:一个条件
if condition
then
command1
command1
…
fi
单行语法(一般令行中执行的时候)
:if [condition] ; then command;fi
语法2:两个条件
If condition
then
command1
command1
…
else
command
fi
语法3:多个条件
If condition1
then
command1
…
elif condition2
command2
else
command3
fi
注意:条件都必须用中括号包着,里面前后各有一个空格,中间在写表达式
3.运算符
在shell中,运算符和其他编程语言一样,常见的有算数运算符,关系运算符,逻辑运算符,字符串运算符
3.1算术运算符
注意:在原生bash(shell)中是不支持简单的算数运算,但是可以通过其他命令来实现,例如awk,expr(最常用)
补充:expr是一款表达式计算工具,使用它能完成表达式的求值操作
例如:两个数相加(注意使用的是反引号`,而不是单引号’)
#!/bin/bash
Val=`expr 2 + 2`
Echo”两个数之和为:$val”
两点注意:表达式和运算符之间要有空格,例如2+2是不对的,必须写成2 + 2。这与我们熟悉的大多数编程语言不一样。
完整的表达式要被``包含,注意这个字符不是常用的单引号,在Esc键下边。
3.2关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字
-eq:equal
-ne:not equal
-gt:great than
-lt:less than
-ge:great than or equal
-le:less than or equal
EG1:使用a=20,b=10
EG2:使用语法写一个简易计算器
3.3逻辑运算符
或运算:一个为真则为真,全部为假则为假
与运算:一个为假则为假,全部为真则为真
or,and
3.4字符串运算符
案例:将上述语法进行验证
3.5文件测试运算符(重点)
块设备:优盘,硬盘
块设备和字符设备文件命令不常用
-q,-k,-u 检查是否有黏着位
EG1:测试上述红框内命令效果
注意:权限几个判断,如果只有一个部分符合,则认为是有权限的。
案例:使用-e运算符,改写”1.4接受用户输入”的案例,在创建文件的时候需要先判断是否存在,如果存在则提示用户并且不执行创建操作,如果不存在则操作
4.shell脚本附带选项(重点)
问题描述:在linux shell中如何处理tall –n 10 access.log 这样的命令行选项
步骤:
调用tail指令
系统内核把后续选项传递给tail
Tail先去打开指定的文件
取出指定的10行
问题:自己写的shell是否也可以像内置命令一样传递一些选项呢?
答:可以的,传递方式和上述的描述一样的,关键是怎么接受
EG:
传递:
#./test.sh a b c
接受:
用脚本中可以用”$1”来表示b, 用”$2”来表示从,用”$3”来表示c,以此类推。($0 表示执行的文件)
接受可以用”$”加上选项对应的序号即可。
测试:编写test14.sh,传递a,b,c输出其值
其实$1,$2是变量。
练习:创建自定义指令”user”,可以直接执行,要求该执行具有以下语法和功能
a.#user add 用户名 添加用户
b.#user –del 用户名 删除用户以及其家目录
验证:
方法一:
方法二:
问题:在这里是执行./test15/sh –add user1123命令,而与红色文字的需求不符合。
答:我们可以使用别名
注意:如果修改了.bashrc文件的话,则需要重新登录用户
验证: