Shell是Linux系统中开机自动加载的一个特殊程序,它将用户输入的指令,转换成Linux内核可以识别的语言,从而让内核执行调用硬件。
Bash是Linux系统中默认使用shell的程序,它位于/bin/bash。
如何查看Linux系统中的Shell种类呢?
[root@xiayan ~]# cat /etc/shells
/bin/sh #是bash命令的软链接 (已经被/bin/bash所替换)
/bin/bash #基准于GNU的框架下发展出的Shell
/usr/bin/sh #已经被bash所替换
/usr/bin/bash #centos和redhat系统默认使用bash shell
/bin/tcsh #csh的增强版,与csh完全兼容 整合了csh,提供更多的功能
/bin/csh #已经被/bin/bash 所替换 (整合C shell,提供更多的功能)
注:nologin:奇怪的shell,这个shell可以让用户无法登录主机。
bash ( /bin/bash)是目前大多数Linux版本采用的默认Shell。
将需要执行的Linux命令保存到一个文件中,然后通过这个程序文件去执行时,我们就说这个程序为 shell 脚本或 shell 程序;在脚本中输入系统的命令以及相关的语法语句组合,比如变量,流程控制语句等,把他们有机结合起来就形成了一个功能强大的 shell 脚本。
作用:
自动化完成软件的安装部署,如安装部署LAMP架构服务
自动化完成系统的管理,如批量添加用户
自动化完成备份,如数据库定时备份
自动化的分析处理,如网站访问量
脚本名称一般使用“.sh”结尾,便于识别
第一行为"#!/bin/bash” #脚本申明(默认解释器)
表示此行以下的代码语句是通过/bin/bash程序来执行。
还有其他类型的解释器,比如#! /usr/bin/python、 #!/usr/bin/expect
注释信息:以"#"开头的语句表示为注释信息,被注释的语句在脚本运行时不会被执行
可执行语句:如echo命令,用于输出””之间的字符串
方法二:不加执行权限
sh + 脚本路径
source +脚本路径
其它方法:执行脚本的方法除了以上常用的两种方式,还有许多别的方法
比如:sh < xy.sh ; cat xy.sh | sh
重定向:
用户通过操作系统处理信息的过程中,包括以下几类交互设备文件
标准输入(STDIN):默认的设备是键盘,文件编号为 0,命令将从标准输入文件中读取在执行过程中需要的输入数据。
标准输出(STDOUT):默认的设备是显示器,文件编号为 1,命令将执行后的输出结果发送到标准输出文件。
标准错误(STDERR):默认的设备是显示器,文件编号为 2,命令将执行期间的各种错误信息发送到标准错误文件。
从键盘接收用户输入的各种命令字串、辅助控制信息,并将命令结果输出到屏幕上;如果命令执行出错,也会将错误信息反馈到屏幕上
重定向输出指的是将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上。
重定向输出使用“>”或“>>”操作符号:
1.>意思是当原来文件中有内容的话,原来的内容会被覆盖掉
2.>>意思是当原来文件中有内容的话,新加的内容会追加到里面而不会覆盖原来的内容
重定向输入指的是将命令中接收输入的途径由默认的键盘改为指定的文件,而不是等待从键盘输入。重定向输入使用“<”操作符。
通过passwd --stdin 密令,结合管道符,实现免交互密码更改。
错误重定向指的是将执行命令过程中出现的错误信息(如选项或参数错误等)保存到指定的文件,而不是直接显示在屏幕上。错误重定向使用"2>操作符
作用:
在实际应用中,错误重定向可用来收集程序执行的错误信息,为排错提供依据,还可以将无关紧要的错误信息重定向到空文件/dev/null 中,以保持脚本输出的简洁,使用"2>”操作符时,会像使用">"操作符一样覆盖目标文件的内容,若要追加内容而不是覆盖文件,则应改用“2>>“操作符。
/dev/null,可以将其看作“黑洞”,所有写入的信息都会用于丢失。
&>和>&符号
&表示等同于的意思
把正确和错误的消息输入到相同的位置
1>&2 把标准输出重定向到标准错误
2>&1 把标准错误重定向到标准输出
管道(pipe)操作为不同命令之间的协同工作提供了一种机制,位于管道符号“|”左侧的命令输出的结果,将作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。
在 Shell 脚本应用中,管道操作通常用来过滤所需要的关键信息。
比如:
查看所有进程的个数:ps -aux | wc -l
查看系统IP地址:ifconfig ens33 |grep -w “inet” |awk ‘{print $2}’
查看所有可登录的用户:cat /etc/passwd | grep “/bin/bash$” | awk -F: ‘{print $1}’
变量是用来临时保存数据的,并且该数据时可以变化的,任何一个语言都离不开变量,如果某个内容需要多次使用并且会重复出现,这样就可以使用变量了,如果需要修改直接修改变量就可以了
常见 Shell 变量的类型:
自定义变量:由用户自己定义、修改和使用
特殊变量:环境变量、只读变量、位置变量、预定义变量
不像其他高级编程语言(如C/C++、Java等)使用前需定义变量的类型int、double等。
Bash中的变量操作相对比较简单,在定义一个新的变量时,一般不需要提前进行声明,而是直接指定变量名称并赋给初始值(内容)即可。
格式: 变量名=变量值
= #用来给变量赋值
变量名 #以字母或下划线开头,区分大小写,不能以数字开头;在shell中变量名一般都为大写
默认情况下,新定义的变量只在当前的 Shell 环境中有效,因此称为局部变量,当进入子程序或新的子 Shell 环境时,局部变量将无法再使用。
为了使用户定义的变量在所有的子 Shell 环境中能够继续使用,减少重复设置工作,可以通过内部命令 export 将指定的变量导出为全局变量。用户可以同时指定多个变量名称作为参数(无须使用“$”符号),变量名之间以空格分隔
env命令用于查看用户当前环境变量
export -n 删除全局变量
在定义变量时可以使用read提示用户手动输入变量
命令格式: read [选项]
选项 | 描述 |
---|---|
-p | 提示用户的信息 |
-n | 定义数字符数 |
-s | 不显示用户输入的内容 |
-t | 定义超时时间,超时没输出自动退出 |
用echo查看和引用变量的值,通过在变量名称前添加前导符号“$”,可以引用一个变量的值,使用 echo 命令可以查看变量,可以在一条 echo 命令中同时查看多个变量值
常用echo选项
选项 | 描述 |
---|---|
-n | 不换行输出 |
-e | 启用\转义解释 |
\n | 换行 |
\t | 横向制表符 |
当变量名称容易和紧跟其后的其他字符相混淆时,需要添加大括号“{}”将其括起来,否则将无法确定正确的变量名称。对于未定义的变量,将显示为空值
还有一些特殊的赋值操作,可以更灵活地为变量赋值,以便适用于各种复杂的管理任务
双引号:允许通过$符号引用其他变量值
单引号:禁止引用其他变量值, $视为普通字符
反撇号:命令替换,提取命令执行后的输出结果
双引号(”)
双引号主要起界定字符串的作用,特别是当要赋值的内容中包含空格时,必须以双引号括起来;其他情况下双引号通常可以省略
单引号(‘)
当要赋值的内容中包含$、“、\等具有特殊含义的字符时,应使用单引号括起来。
在单引号的范围内,将无法引用其他变量的值,任何字符均作为普通字符看待。输入什么就显示什么
但赋值内容中包含单引号(‘)时,需使用\’符号进行转义,以免冲突。
反撇号(`)
反撇号主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量。
反撇号括起来的范围内必须是能够执行的命令行,否则将会出错
反撇号为Esc下的那个键
在bash环境中也可以进行加减乘除等运算:
运算内容:加(+)、减(-)、乘(*)、除(/)、取余(%)
expr命令还可以配合[]与(())使用
(())与[]相同
let运算命令允许改变量值,但是需配合echo命令将其输出
使用let命令实现变量值自加或自减
系统自带的环境变量位于:/etc/profile 、~/.bash_profile为当前用户环境变量
在系统用我们比较熟悉的变量有:HOME、USER、SHELL、PATH等
当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。
使用位置变量获取IP地址
readonly 命令设置只读变量
readonly A=10 #设置为只读变量
echo $A
A=10 #只读变量不可以被重新赋值
unset A #只读变量不可以被删除
预定义变量是由Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。预定义变量使用*$"符号和另一个符号组合表示
$#:表示命令行中位置参数的个数。
$*:表示所有位置参数的内容,这些内容当做一个整体
$@:表示列出所有位置参数,但是是以单个的形式的列出
$?:表示前一条命令执行后的返回状态,返回值为О表示执行正确,返回任何非О值均表示执行出现异常。
$0:表示当前执行的脚本或程序的名称
$$:表示返回当前进程的进程号
$!:返回最后一个后合进程的进程号
1.shell脚本中的变量建议尽量使用大写字母,不能使用数字开头
2.脚本执行方式使用加权限的绝对或相对路径方法使用,或者使用sh直接执行
3.在使用引号时,一定要搞清楚每个的含义,双引号可以引用变量,单引号不能引用变量,反撇号是引用命令
4.使用expr命令时注意运算符号前后要用空格