Shell 简介
Shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质
用户通过 Shell 来使用 Linux,不启动 Shell 的话,用户就没办法使用 Linux;Shell 就是一个“中间商”,它在用户和内核之间“倒卖”数据
进入 Shell 的方法是让 Linux 系统退出图形界面模式,进入控制台模式,这种模式称为 Linux 控制台
Bash的功能和特性
历史命令:保存执行过的命令,可以快速重复执行(history)
命令别名:将长命令简化为短命令,或用习惯用法代替(--all(长格式) –l(短格式))
命令和文件路径补全:通过Tab键快速输入命令名或路径名
通配符:快速查找和处理文件
管道和重定向:最常使用的操作之
Bash变量
定义:
定义变量时通常不需要指明类型,直接赋值就可以
用“=”连接变量名和变量值;设置变量值时,“=”左右不能直接连接空格
在 Bash shell 中,每一个变量的值都是字符串(可以使用 Shell declare 关键字显式定义变量的类型)
使用:
两种形式:$variable_name 或 ${variable_name}
使用echo 命令测试
注:
$variable_name定义的时候,定义变量最好采用variable_name=""带引号的形式
${variable_name}写法比较规范,定义变量时不带引号也没关系
规则:
1. 变量名由字母、数字和下划线组成
2. 必须以字母或者下划线开头,首字符不能是数字
3. 不能使用Shell里的关键字
4. 单双引号不同
单引号' '包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令也会把它们原样输出
双引号" "包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出
5. 转义符“”将特殊字符转义为一般字符
6. 修改变量值
为变量追加新内容,建议使用 ”$variable_name ” 或 ${variable_name } 的形式
[zxy@localhost 20220505]$ var='abc' //定义变量
[zxy@localhost 20220505]$ echo $var //查看变量值
abc
[zxy@localhost 20220505]$ var1=zhang
[zxy@localhost 20220505]$ var2=xiao
[zxy@localhost 20220505]$ var3=zxy
[zxy@localhost 20220505]$ echo $var1
zhang
[zxy@localhost 20220505]$ echo ${var2}
xiao
[zxy@localhost 20220505]$ echo $var3
zxy
[zxy@localhost 20220505]$ var3="num is $var" //双引号用法
[zxy@localhost 20220505]$ echo $var3
num is abc
[zxy@localhost 20220505]$ var3='num is $var' //单引号用法
[zxy@localhost 20220505]$ echo $var3
num is $var
[zxy@localhost 20220505]$ var1=zhang xiao yu //转义符
[zxy@localhost 20220505]$ echo $var1
zahng xiao yu
[zxy@localhost 20220505]$ echo $var2
xiao
[zxy@localhost 20220505]$ var2="$var2" yu //修改值,追加内容yu
[zxy@localhost 20220505]$ echo $var2
xiao yu
read 命令
[zxy@localhost 20220505]$ read var
132 // 在键盘上输入这一行然后按回车键
[zxy@localhost 20220505]$ read -p "your information:" name age // 设置输入提示
your information:an 20
[zxy@localhost 20220505]$ echo $var
132
[zxy@localhost 20220505]$ echo $name
zxy
[zxy@localhost 20220505]$ echo $age
20
declare 命令
使用declare命令修改变量的数据类型
[zxy@localhost ~]$ var=8/5
[zxy@localhost ~]$ echo $var
8/5
[zxy@localhost ~]$ var=3*7
[zxy@localhost ~]$ echo $var
3*7
//使用declare定义变量数据类型
[zxy@localhost ~]$ declare -i var //-i声明为整型
[zxy@localhost ~]$ var=3*7
[zxy@localhost ~]$ echo $var
21
[zxy@localhost ~]$ var=8/5
[zxy@localhost ~]$ echo $var
1
unset 命令
使用unset取消或删除变量,在unset命令后跟变量名即可
[zxy@localhost 20220505]$ echo $var
21
[zxy@localhost 20220505]$ echo $var1
zhang xiao yu
[zxy@localhost 20220505]$ echo $var2
xiao yu
[zxy@localhost 20220505]$ echo $var3
num is $var
[zxy@localhost 20220505]$ unset var
[zxy@localhost 20220505]$ unset var3
[zxy@localhost 20220505]$ unset var2
[zxy@localhost 20220505]$ echo $var2
环境变量
操作系统内置的变量
使用env和export命令查看系统当前的环境变量
变量的作用范围
打开一个Bash窗口就在操作系统中创建了一个Bash进程
在Bash窗口中执行的命令也都是进程(子进程)
子进程运行时,父进程一般处于“睡眠”状态
子进程执行完毕,父进程重新开始运行
[zxy@localhost 20220505]$ echo $$
12674 // 父进程PID
[zxy@localhost 20220505]$ bash // 使用bash命令创建子进程
[zxy@localhost 20220505]$ echo $$ // 子进程PID
13797
[zxy@localhost 20220505]$ exit //退出子进程
exit
[zxy@localhost 20220505]$ echo $$
12674
Shell 特殊变量及其含义
重定向基本概念
输入重定向:从键盘流向程序,如果改变了它的方向,数据就从其它地方流入
1. 输入重定向就是改变输入的方向,不再使用键盘作为命令输入的来源,而是使用文件作为命令的输入。
2. 功能:将原来从键盘输入的数据改为从文件读取
输出重定向:从程序流向显示器,如果改变了它的方向,数据就流向其它地方
1. 输出重定向是指命令的结果不再输出到显示器上,而是输出到其它地方,一般是文件中。
2. 在命令后输入大于号“>”并且后跟一个文件名,对原文件的内容进行了“覆盖”,即清空原文件内容
3. 在命令后输入两个大于号“>>”并且后跟一个文件名,表示在原文件的基础上“追加”新内容
[zxy@localhost 20220505]$ pwd
/home/zxy/20220505
[zxy@localhost 20220505]$ pwd > pwd.result // 将pwd命令结果输出到文件pwd.result中,自动创建文件pwd.result
[zxy@localhost 20220505]$ cat pwd.result
/home/zxy/20220505
[zxy@localhost 20220505]$ pwd >> pwd.result // 追加内容
[zxy@localhost 20220505]$ cat pwd.result
/home/zxy/20220505
/home/zxy/20220505
[zxy@localhost 20220505]$ touch aa
[zxy@localhost 20220505]$ vi aa
[zxy@localhost 20220505]$ cat aa
9*9
99*99
999*999
[zxy@localhost 20220505]$ bc < aa // 从文件获得输入
81
9801
998001
[zxy@localhost 20220505]$ bc < aa > bb
[zxy@localhost 20220505]$ cat bb
81
9801
998001
连续执行命令
命令间没有依赖关系
命令间用分号“;”分隔
适合于命令之间没有依赖关系的情况
不管前一条命令成功或失败,后一条命令都会执行
命令间有依赖关系
命令间用“&&”或“||” 连接
用“$?”查看前一条命令执行结果
管道命令
功能:一个命令的输出成为另一个命令的输入
使用管道符号“|”连接两个命令,左侧命令的输出成为右侧命令的输入
[zxy@localhost 20220505]$ ls | grep aa //查看文件 aa 是否存在于当前目录下
aa
[zxy@localhost 20220505]$ ls -al | grep aa > cc //将上述管道命令的输出结果发送到文件cc
[zxy@localhost 20220505]$ cat cc
-rw-rw-r--. 1 zxy zxy 18 5月 5 18:13 aa
命令历史记录
功能:保存命令行窗口中执行过的命令以便后续查找或执行
使用history命令处理和历史命令相关的操作
HISTSIZE变量指定history命令最多可以显示的命令条数,默认值是1000
HISTFILESIZE变量指定历史命令文件最多可以保存的命令总数,默认值是1000
操作:
重复执行上一条命令
在命令行中输入“!!”或“!-1”可以快速执行上一条命令
“!-n”表示执行最近的第n条命令
按【Ctrl+P】或键盘的向上方向键调出最近一条命令,按回车键执行
通过命令编号执行历史命令
使用“!n ”可以快速执行编号为n的历史命令
通过命令关键字执行历史命令
使用“!cmd ”可以查找最近一条以cmd开头的命令并执行
通过【Ctrl+R】组合键搜索历史命令
使用【Ctrl+R】组合键对历史命令进行搜索,按回车键即可执行
Shell脚本
#!/bin/bash
#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell;
后面的/bin/bash就是指明了解释器的具体位置
扩展名sh代表 shell
执行方式:
方式一:使用sh或bash命令执行脚本文件;不管脚本文件有没有可执行权限,都可以采用这种方式执行
方式二:使用source命令或点运算符“.”执行脚本文件,后跟脚本文件名
[zxy@localhost 20220505]$ sh text.sh //方式一
hello world !
[zxy@localhost 20220505]$ . text.sh //方式二
hello world !
[zxy@localhost 20220505]$ source text.sh //方式二
hello world !
脚本状态码
脚本文件执行结束,都会返回一个整数类型的状态码,表示脚本文件的执行结果
一般用0表示执行成功,用非0值表示异常结束
可以使用 “$?” 特殊变量查看状态码
还可以使用exit命令指定返回值,形式为exit n,取值范围是0~255
[zxy@localhost 20220505]$ cat -n text.sh
1 #!/bin/bash
2 echo "hello world !"
[zxy@localhost 20220505]$ source text.sh
hello world !
[zxy@localhost 20220505]$ echo $?
0
算术运算
采用 “$(( exp ))” 的形式,内层的小括号中是算术表达式
“$(( ))”只支持整数的算术运算
表达式中的变量可以不使用“$”前导符号
[an@localhost 20220505]$ echo $((9*9))
81
运算符包括“<” “>” “<=” “>=” “==” “!=”
比较结果为真,表达式返回1,否则返回0
[an@localhost 20220505]$ a=5
[an@localhost 20220505]$ b=10
[an@localhost 20220505]$ echo $((a > b))
0
[an@localhost 20220505]$ echo $((a != b))
1
test条件测试
主要用于判断一个表达式的真假,亦即表达式是否成立
如果表达式为真,test命令返回0值,否则返回一个非0值
使用 “$?”特殊变量获取test命令的返回值
关系运算
[zxy@localhost work]$ vi aaa.sh
[zxy@localhost work]$ cat aaa.sh
#!/bin/bash
a=11 ; b=16
test $a -eq $b && echo "$a = $b" || echo "$a != $b" // 若a = b 则返回a = b,否则返回a != b
test $a -gt $b && echo "$a > $b" || echo "$a <= $b" // 若a = b 则返回a > b,否则返回a <= b
test $a -ge $b && echo "$a >= $b" || echo "$a < $b" // 若a >= b 则返回a >= b,否则返回a < b
[zxy@localhost work]$ sh aaa.sh
11 != 16
11 <= 16
11 < 16
字符串运算
[zxy@localhost work]$ vi aaa.sh
[zxy@localhost work]$ cat aaa.sh
#!/bin/bash
a="centos"
b=""
test -z "$a" && echo "'$a' is null" || echo "'$a' is not null" // 若a 为空 则返回a is null,否则返回a is not null
test -n "$b" && echo "'$b' is not null" || echo "'$b' is null" // 若b 非空 则返回b is not null,否则返回a is null
test "$a" == "centos" && echo "'$a' = '$b'" || echo "'$a' != '$b'" // 若a == b 则返回a = b,否则返回a != b
[zxy@localhost work]$ sh aaa.sh
'centos' is not null
'' is null
'centos' != ''
[] 条件测试
test 命令也可以简写为[]
表达式的格式有特别的规定:操作数、运算符及中括号要用空格分隔
eg:[ expression ] #注意[]和expression之间的空格,这两个空格是必须的
[zxy@localhost work]$ vi ccc.sh
[zxy@localhost work]$ vi ccc.sh
[zxy@localhost work]$ cat ccc.sh
#!/bin/bash
a="ccc.sh"
b="zzxxyy.txt"
#判断文件a是不是普通文件
test -f "$a" && echo "$a: ordinary file " || echo "$a: not ordinary file"
#判断文件a是不是存在且可读
test -r "$a" && echo "$a: readable " || echo "$a: not readable"
#判断a创建时间是否比b新
test "$a" -nt "$b" && echo "$a is newer than $b" || echo "$b is newer than $a"
[zxy@localhost work]$ sh ccc.sh
ccc.sh: ordinary file
ccc.sh: readable
ccc.sh is newer than zzxxyy.txt



