第十章 Shell基础
文章目录
shell概述
- shell 的概念
- shell 是一个命令解释器, 将内核与应用程序所要传达的信息, 通过 shell, 翻译成内核可识别的二进制码和用户可识别的命令.
内核通过调用硬件, 完成操作, 硬件把执行结果返回给内核, 经 shell 解释, 返回给用户.- shell 还是一个编程语言. 它是解释执行的脚本语言, 在 shell 中可直接调用 linux 系统命令.
-
shell 的分类
- Bourne shell : 它的主文件名为
sh
- 主要包括 : sh, ksh, Bash, psh, zsh
- C shell : 其语法和C语言相似
- 主要包括 : csh, tcsh
两种 shell 语法结构完全不相同, 两种语法彼此不兼容.
Bash : Bash 与 sh 兼容, 现在 linux 使用的基本 shell 就是 Bash.
- Bourne shell : 它的主文件名为
-
linux 支持的 shell
vi /etc/shells
{
/bin/sh
/bin/bash : 系统默认的 shell
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
}
shell脚本的执行方式
- echo输出命令
echo [-e] "内容"
: 输出内容
-e
: 支持转义符进行转义
字符 | 作用 |
---|---|
\ \ | 输出\ |
\b | 退格键 |
\f | 换页符 |
\n | 换行键 |
\r | 回车键 |
\t | Tab键 |
- 第一个脚本
vi hello.sh
{
#!/bin/Bash : 脚本的标称, 以下内容为 shell 脚本
#the first program : 注释
echo "hello world"
}
.sh
为脚本扩展名, 告ji诉系统此文脚本文件, 也可以不加, 建议加上, 方便识别.
- 执行脚本
- 赋予权限
chmod 755 hello.sh
- 执行
./hello.sh
: 通过绝对路径或相对路径来执行
- 赋予权限
bash的基本功能
历史命令与命令补全
- 历史命令
history [参数] [历史命令保存文件]
参数 :
-c : 清空历史命令, 不建议使用
-w : 把缓存中的历史命令写入历史命令保存文件~/.bash_history
该文件在家目录下, 且为隐藏文件, 用户退出之后才会将历史命令写入该文件中.
历史命令默认保存1000条, 可以在环境变量配置文件
/etc/profile
中进行修改.
vi /etc/profile
{
HISTORY=1000 : 可手动改写
}
- 历史命令的调用
使用上下箭头调用以前的历史命令.
- 命令与文件补全
在 Bash 中, 只要早输入命令或文件时, 按
Tab
键就会自动补全.
命令别名与常用快捷键
- 命令别名
alias [别名='原命令']
: 设定命令别名
alias
: 查看系统所有命令别名 - 命令执行时的顺序 ( 越上越优 )
- 用绝对路径或相对路径执行的命令
- 执行别名
- 执行 Bash 的内部命令
- 执行按照 $PATH 环境变量定义的目录查看找顺序找到的第一个命令
- 让别名永久生效
vi /root/.bashrc
{
alias vi='vim' : 添加所想要生效的命令别名
}
- 删除别名
unalias 别名
- Bash 常用快捷键
快捷键 | 作用 |
---|---|
ctrl + A | 把光标移动到命令行开头 |
ctrl + E | 移到结尾 |
ctrl + C | 强制终止当前的命令 |
ctrl + D | 退出当前终端 |
ctrl + L | 清屏, 相当于clear命令 |
ctrl + U | 删除或剪切光标之前的命令 |
ctrl + Y | 粘贴 |
输入输出重定向
- 标准输入输出设备
- 键盘 : 标准输入
- 显示器 : 标准输出
- 输出重定向
将命令的输出结果输出到指定文件中
命令 > 文件
: 覆盖
命令 >> 文件
: 追加 - 输入重定向
不常用, 了解就好
多命令顺序执行与管道符
- 多命令顺序执行
;
: 命令和命令之间无关
dd命令 : date ; if=/dev/zero of=/root/testfile bs=1k count=100000 ; date
{
两个date与dd命令无关
if=输入文件 : 指定源文件
of=输出文件 : 指定目标文件
bs=字节数 : 一次输出输入多少字节
count=个数 : 指定输出输入多少个数据块
即 bs * count =文件大小
}
&&
: 逻辑与 ( 当第一条命令执行成功后下一条命令才能执行 )
ls && ehco yes
||
: 逻辑或 ( 当第一条命令执行失败后下一条命令才能执行 )
lst || echo no
ls && echo yes || echo no
: 判断命令是否可以正确执行|
: 管道符 ( 第一条命令的正确输出作为第二条命令的操作对象 )
ll -a /etc | more
netstat -an | grep "ESTABLISHED"
grep命令 [参数] 搜索内容 文件名
{
grep -in curry /root/stephen
参数:
{
-i : 不区分大小写
-n : 显示行号
-v : 反向查找
--color=auto : 搜索出的关键字用颜色显示
}
}
通配符与其他特殊符号
- 通配符 ( 匹配文件名 )
通配符 | 作用 |
---|---|
? | 匹配一个任意字符 |
* | 匹配0个或多个字符 |
[] | 匹配中括号中任意一个字符, 如[abc]:匹配a或b或c中的一个 |
[-] | -代表一个范围, 如[a-z]:匹配一个字母 |
[^] | 逻辑非, 匹配非中括号内的一个字符, 如[^0-9]:匹配一个非数字字符 |
- 其他特殊符号
特殊符号 | 作用 |
---|---|
’ ’ | 单引号, 单引号中的所有特殊符号都没有特殊含义 |
" " | 双引号, $:调用变量的值; `:引用命令; :转义符 |
`` | 反引号 ( esc键下边的符号 ), 反引号括起来的都是系统命令, 在bash中会先执行它 |
$() | 和反引号作用一样 |
# | 在shell脚本中, #开头的行表示注释 |
$ | 调用变量的值 |
\ | 转义符 |
bash的变量
用户自定义变量
- 变量 : 计算机内存的单元, 其中存放的值可以改变
- 变量设置规则 :
- 可以由字母, 数字和下划线组成, 不能以数字开头;
- 变量的默认类型都是字符串型, 可以指定变量类型;
- 变量用等号连接值, 等号左右两侧不能有空格, 如
name=curry
; - 赋的值如果有空格, 需要使用单引号或双引号包括, 如
name='stephen curry'
; - 赋的值中, 可以使用转义符;
- 赋的值是可以叠加的;
- 环境变量名建议大写, 便于区分.
- 变量的分类 :
- 自定义变量
- 环境变量 : 主要保存的是和系统操作环境相关的数据
- 位置参数变量 : 主要用来向脚本中传递参数或数据的, 变量名不能自定义, 变量的作用是固定的
- 预定义变量 : 已经定义好的变量, 变量名不能自定义, 变量作用是固定的 ( 位置参数变量是预定义变量特殊的一种 )
- 从上往下定义变量的规则越严格.
- 自定义变量 ( 本地变量 )
- 变量定义 :
name="curry"
- 变量调用 :
echo $name
- 变量叠加 :
aa=123
aa="$aa"456
- 变量查看 ( 所有 ) :
set
- 变量删除 :
unset name
- 变量定义 :
环境变量
- 环境变量 :
本地变量只在当前的shell中生效, 而环境变量会在当前shell和这个shell的所有子shell中生效, 如果把环境变量写入相应的配置文件, 那么这个环境变量就会在所有的shell中生效. - 设置环境变量 :
- 变量定义 :
export name=curry
- 变量查询 ( 环境变量 ) :
env
- 变量删除 :
unset name
- 变量定义 :
- 系统常见的环境变量 :
-
PATH : 系统查找命令的路径
echo $PATH
:
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin
路径之间以:
分隔- 命令是已在配置文件中将命令的执行路径写好了, 单敲命令即可
- 而脚本是通过绝对路径或相对路径的方式来执行
- 如果把PATH变量叠加, 脚本就可直接执行了
- 如
PATH="$PATH":/tmp
, 脚本放在了/tmp
目录下, 这样该目录下的脚本就可以直接执行了
-
PS1 : 定义系统提示符的变量
echo $PS1
:
[\u@\h \W]\$
- 与
[root@localhost tmp]#
对应 \u
: 显示用户名\h
: 显示主机名\W
: 显示当前所在目录的最后一个目录\$
: 提示符, 如果root用户会显示为#
, 如果是普通用户会显示为$
- 与
-
位置参数变量
$n
: n为数字,$0
表示命令本身,$1-9
表示第一到第九个参数, 十以上的参数需用大括号包含, 如${10}
$*
: 代表命令行中所有的参数, 把参数看成一个整体$@
: 代表命令行中所有的参数, 把每个参数区别对待$#
: 代表命令行中所有参数的个数
[root@localhost tmp]# cat canshu1.sh
#!/bin/bash
echo $0
echo $1
echo $2
echo $3
echo $4
echo $5
echo $6
echo $7
echo $8
echo $9
echo ${10}
echo ${11}
[root@localhost tmp]# ./canshu1.sh 1 2 3 4 5 6 7 8 9 11 18
./canshu1.sh # $0输出的结果
1
2
3
4
5
6
7
8
9
11 # ${10}的输出结果
18 # ${11}的输出结果
[root@localhost tmp]# cat canshu2.sh
#!/bin/bash
sum=$(( $1 + $2 ))
echo "sum=$sum"
[root@localhost tmp]# ./canshu2.sh 10 20
sum=30 # $1+$2的输出结果
[root@localhost tmp]# cat canshu3.sh
#!/bin/bash
echo $#
echo $*
echo $@
[root@localhost tmp]# ./canshu3.sh 1 2 3 4
4 # $#的输出结果
1 2 3 4 # $*的输出结果
1 2 3 4 # $@的输出结果
[root@localhost tmp]# cat canshu4.sh
#!/bin/bash
for i in "$*"
do
echo $i
done #这个循环循环了一次, 因为$*将参数看成了一个整体
for j in "$@"
do
echo $j
done #这个循环循环了四次, 因为$@将参数看成了四部分
[root@localhost tmp]# ./canshu4.sh 1 2 3 4
1 2 3 4 #这是变量i的输出结果
1
2
3
4 #这是变量j的输出结果
预定义变量
$?
: 返回0则证明上一条命令正确执行, 为非0则证明上一条命令没有正确执行$$
: 显示当前进程号( pid )$!
: 后台运行的最后一个进程的进程号( pid )
[root@localhost tmp]# cat canshu5.sh
{
#!/bin/bash
echo $$
find /tmp -name curry & 注 : 符号&的意思是把命令放在后台执行
echo $!
}
[root@localhost tmp]# ./canshu5.sh
3293 $$的输出结果
3294 $!的输出结果
- 接受键盘输入
read [参数] [变量名]
参数:-p "提示信息"
: 在等待read输入时, 输出提示信息-t 秒数
: 指定等待用户输入的时间-n 字符数
: 只接受指定字符数就会执行-s
: 隐藏输入的数据
[root@localhost tmp]# cat canshu6.sh
{
#!/bin/bash
read -t 30 -p "please input your name: " name
echo $name
read -t 30 -s -p "please input your age: " age
echo -e "\n" 注 : \n换行
echo $age
read -t 30 -n 1 -p "your gender is [m/f]" gender
echo -e "\n" 注 : \n换行
echo $gender
}
[root@localhost tmp]# ./canshu6.sh
please input your name: curry
curry
please input your age:
34
your gender is [m/f]m
m
bash的运算符
数值运算与运算符
declare [参数] 变量名
: 声明变量类型
参数:-i
: 将变量声明为整数型-x
: 将变量声明为环境变量 ( integer )-p
: 显示指定变量的被声明的类型
[root@localhost tmp]# aa=11
[root@localhost tmp]# bb=22
[root@localhost tmp]# declare -i cc=$aa+$bb
[root@localhost tmp]# echo $cc
33
变量名=$(( $变量a+$变量b ))
: 常用的数值运算方法
[root@localhost tmp]# dd=$(( $aa+$bb ))
[root@localhost tmp]# echo $dd
33
- 运算符
优先级 | 运算符 | 说明 |
---|---|---|
1 | *, /, % | 乘除取模 |
2 | +, - | 加减 |
3 | ==, != | 等于 不等于 |
4 | && | 逻辑与, 有0则0, 否则为1 |
5 | 两竖杠 | 逻辑或, 全0则0, 否则为1 |
6 | =, +=, -= | 赋值 |
优先级 : 越小越优
环境变量配置文件
环境变量配置文件简介
source 配置文件
: 使配置文件生效
环境变量的配置文件修改之后需要用户重新登录才能生效, 这里使用source命令可以直接使其生效.
source可以写成
.
- 环境变量配置文件主要是定义系统默认的环境变量
环境变量配置文件作用
/etc/prifile
/etc/profile.d/*.sh
/etc/bashrc
~/.bash_profile
~/.bashrc
前三个配置文件在
/etc
目录下, 对任何用户都生效.
后两个配置文件在用户的家目录中, 只对属于该家目录的用户生效.
用户登录不输入用户名密码 : 环境变量配置文件的执行顺序为 1 -> 4 -> 5 -> 3 -> 登录成功
用户登录输入用户名密码 : 环境变量配置文件的执行顺序为 1 -> 2 -> 登录成功
- 配置文件1的作用 :
- 定义
- USER变量
- LOGNAME变量
- MAIL变量
- PATH变量
- HOSTNAME变量
- HISTSIZE变量
- umask的值
- 调用配置文件2
- 定义
- 配置文件2的作用 :
- 调用配置文件
/etc/profile.d/lang.sh
- 调用
/etc/locale.conf
- 调用
/etc/locale.conf
- 定义系统语言为
utf-8
- 定义系统语言为
- 调用配置文件
- 配置文件4的作用 :
- 定义PATH变量
- 调用配置文件5
- 配置文件5的作用 :
- 定义用户别名
- 调用配置文件3
- 配置文件3的作用 :
- 定义系统提示符
- 定义PATH变量
- 定义umask的值
- 调用配置文件2
其他配置文件和登录信息
- 注销时生效的环境变量配置文件
~/.bash_logout
: 默认情况下是空文件, 可以手动添加想要执行的命令 - 历史命令保存的配置文件
~/.bash_history
: 注销前的历史命令保存文件 - shell登录信息
/etc/moty
: 本地登录和远程登录信息
[root@localhost ~]# cat /etc/motd
警告:没有权限的用户请退出! #编辑的登录信息
[root@localhost ~]# systemctl restart sshd.service #重启ssh服务
[root@localhost ~]# logout #退出重新登录
Last login: Sat Apr 22 15:36:25 2023 from 192.168.200.1
警告:没有权限的用户请退出! #显示的登录信息
[root@localhost ~]#