Shell

153 阅读4分钟

Shell

Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当一个”命令解释器“的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出结果。 它是用户使用 Linux 的桥梁。

Shell 既是一种命令语言,又是一种程序设计语言。

linux 中常见的shell

  • bash:基于GUN的框架下发展的shell
  • csh:类似C语言的shell
  • tcsh:整合了csh 提供了更多功能
  • sh:已经被bash替换
  • nologin:让用户无法登录

注:bash(/bin/bash)是目前大多数 Linux 版本采用的默认 Shell。

shell 脚本

shell脚本的作用

  • 自动化运维
  • 批量化重复操作可以编写脚本结合计划任务自动周期运行
  • 减轻管理员工作量
  • 提高处理文本文件的速度
  • 避免配置出错

image.png

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 426 16:48 vmlinuz-0-rescue-03052fe4371d4b73a5202278741368aa
-rwxr-xr-x. 1 root root 5.7M 823 2017 vmlinuz-3.10.0-693.el7.x86_64
[root@localhost opt]# ./first.sh 
当前的目录位于:
/boot
其中以 vml 开头的文件包括:
-rwxr-xr-x. 1 root root 5.7M 426 16:48 vmlinuz-0-rescue-03052fe4371d4b73a5202278741368aa
-rwxr-xr-x. 1 root root 5.7M 823 2017 vmlinuz-3.10.0-693.el7.x86_64

指定Shell来解释脚本,不要求文件必须有 x 权限。

  • sh 脚本路径
  • source 脚本路径 image.png

重定向

重定向的意思就是,不通过标准输出到默认屏幕上,而是输出到你指定的位置。

输入重定向

符号作用
命令 < 文件从指定的文件读取文件,而不是从键盘输入
命令 << 分界符从标准输入中读入,直到遇见分界符才停止
命令 < 文件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,修改这个文件只作用于当前用户。

image.png

只读变量

我们在定义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