Shell
Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当一个”命令解释器“的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出结果。 它是用户使用 Linux 的桥梁。
Shell 既是一种命令语言,又是一种程序设计语言。
linux 中常见的shell
- bash:基于GUN的框架下发展的shell
- csh:类似C语言的shell
- tcsh:整合了csh 提供了更多功能
- sh:已经被bash替换
- nologin:让用户无法登录
注:bash(/bin/bash)是目前大多数 Linux 版本采用的默认 Shell。
shell 脚本
shell脚本的作用
- 自动化运维
- 批量化重复操作可以编写脚本结合计划任务自动周期运行
- 减轻管理员工作量
- 提高处理文本文件的速度
- 避免配置出错
Shell脚本的执行
指定路径的命令,要求文件必须有 x 权限。
[root@localhost opt]# vim first.sh
[root@localhost opt]# chmod 777 first.sh
[root@localhost opt]# /opt/first.sh
当前的目录位于:
/boot
其中以 vml 开头的文件包括:
-rwxr-xr-x. 1 root root 5.7M 4月 26 16:48 vmlinuz-0-rescue-03052fe4371d4b73a5202278741368aa
-rwxr-xr-x. 1 root root 5.7M 8月 23 2017 vmlinuz-3.10.0-693.el7.x86_64
[root@localhost opt]# ./first.sh
当前的目录位于:
/boot
其中以 vml 开头的文件包括:
-rwxr-xr-x. 1 root root 5.7M 4月 26 16:48 vmlinuz-0-rescue-03052fe4371d4b73a5202278741368aa
-rwxr-xr-x. 1 root root 5.7M 8月 23 2017 vmlinuz-3.10.0-693.el7.x86_64
指定Shell来解释脚本,不要求文件必须有 x 权限。
- sh 脚本路径
- source 脚本路径
重定向
重定向的意思就是,不通过标准输出到默认屏幕上,而是输出到你指定的位置。
输入重定向
| 符号 | 作用 |
|---|---|
| 命令 < 文件 | 从指定的文件读取文件,而不是从键盘输入 |
| 命令 << 分界符 | 从标准输入中读入,直到遇见分界符才停止 |
| 命令 < 文件1 > 文件2 | 将文件1 作为命令的标准输入并将标准输出到文件2 |
输出重定向
| 符号 | 作用 |
|---|---|
| 命令 > 文件 | 将标准输出结果保存到指定的文件中(覆盖原有内容) |
| 命令 >> 文件 | 将标准输出结果追加到指定的文件尾部 |
| 命令 2> 文件 | 将错误输出信息保存到指定文件中(覆盖原有内容) |
| 命令 2>> 文件 | 将错误输出信息追加到指定文件尾部 |
| 命令 > 文件 2>&1 | 混合输出,将标准输出与错误输出保存到文同一个文件中 |
示例:
[root@localhost opt]# useradd test1
[root@localhost opt]# echo "123456" > 1.txt //标准输出重定向
[root@localhost opt]# cat 1.txt
123456
[root@localhost opt]# passwd --stdin test1 < 1.txt //标准输入重定
更改用户 test1 的密码 。
passwd:所有的身份验证令牌已经成功更新。
管道符
管道符的作用是连接两个命令,将第一个命令的标准输出作为第二个命令的标准输入。 同一行命令中可以使用多个管道符。
格式:命令A | 命令B
[root@localhost opt]# ps aux | wc -l //统计进程数量
151
[root@localhost opt]# ss -ntap | grep 22 //查看22端口是否开启
LISTEN 0 5 192.168.122.1:53 *:* users:(("dnsmasq",pid=1389,fd=6))
LISTEN 0 128 *:22 *:* users:(("sshd",pid=1028,fd=3))
ESTAB 0 0 192.168.88.100:22 192.168.88.1:11675 users:(("sshd",pid=1568,fd=3))
LISTEN 0 128 :::22 :::* users:(("sshd",pid=1028,fd=4))
变量
变量类型:
- 字符串string(abc)
- 整型int(1,2)
- 浮点型(1.1)
- 布尔型(0,1)
局部变量
定义变量: 变量名=变量值
查看变量:
- echo $变量名:查看单个变量
- set:查看所有变量,包括局部变量和环境变量
取消变量: unset 变量名
环境变量
[root@localhost opt]# echo $PATH //$PATH 表示可执行文件的默认路径
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost opt]# echo $USER //$USER 表示用户名称
root
[root@localhost opt]# echo $HOME // $HOME 表示用户的宿主目录
/root
[root@localhost opt]# echo $LANG //$LANG 表示语言和字符集
zh_CN.UTF-8
[root@localhost opt]# echo $PWD //$PWD 表示当前所在工作目录
/opt
环境变量的配置文件
自定义的环境变量只是临时生效,退出系统后就会失效。需要将自定义的环境变量放入配置文件中,才会永久生效。配置文件可以用来长期变更或设置环境变量。
全局配置文件:
- /etc/profile,修改此文件会作用于所有用户。
用户独立的配置文件:
- ~/.bash_profile,修改这个文件只作用于当前用户。
只读变量
我们在定义shell变量时,默认定义的变量是可以被修改的,但有一种变量是不能修改的,就是只读变量。 只读变量只能被赋值一次。只读变量在取得初始值之后,只能进行读取操作,不能重新赋值或删除。
[root@localhost data]# year=2022
[root@localhost data]# readonly year
[root@localhost data]# echo $year
2022
[root@localhost data]# year=2023
-bash: year: 只读变量
[root@localhost data]# unset year
位置变量
使用$n表示,n为数字序列号,且必须为整数。
[root@localhost ~]# cat weizhi.sh
echo "$1" #显示位置1的参数
echo "$2" #显示位置2的参数
echo "$3" #显示位置3的参数
[root@localhost ~]# bash weizhi.sh aaa bbb ccc
aaa //对应$1
bbb //对应$2
ccc //对应$3
预定义变量
预定义变量是系统定义好的变量,用来保持脚本程序的执行信息。
$* 和 $@的区别:
- 不加双引号的话,
$*和$@都代表脚本后面跟的所有参数。 - 加上双引号的话,"
$*"会把所有参数当作一个整体去看待(此时参数数量为1),"$@"会把脚本后面跟的每一个参数当作一个个体去看待。
[root@localhost ~]# ls /opt rh
[root@localhost ~]# echo $? //返回0表示执行正常
0
[root@localhost ~]# ls /xxx
ls: 无法访问/xxx: 没有那个文件或目录
[root@localhost ~]# echo $? //返回非0表示执行出现异常
2