赞
踩
Shell是一个命令解释器,它在操作系统的最外层,负责直接与用户进行对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕反馈个用户,这种对话方式可是交互也可是非交互的,我们所输入的命令计算机是不是别的,这是就需要一种程序来帮助我们进行翻译,编号才能计算机能识别的二进制程序,同时又把计算机生成的结果返回给我们。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2gYGnYtq-1682415440126)(https://typoreydp.oss-cn-nanjing.aliyuncs.com/1000(1)].png)
linux系统中的shell是一个特殊的应用程序,它介于 操作系统和用户的之间,充当一个”命令解释器“的角色,负责输入的操作指令,并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
常见的shell解器有很多中,使用不同的shell,其内部指令、命令性提示符等方面会存在一些区别,通过/etc/shells 文件可以了解当前系统所支持的shell脚本种类。
为什么我们的系统上合法的shell要写入/etc/shells这个文件?
答:系统某些服务要运行的时候,会去检查用户能够使用的shells,而这些shell的查询就是借由/etc/shells这个文件。
用户什么时候可以取得shell来工作?系统默认的shell是哪个?
答: 登录系统时,系统就会加载shell来工作,而登录取得的shell在/etc/passwd这个文件。
shell的种类 | shell的功能 |
---|---|
/usr/bin/sh | 已被/bin/bash替换 |
/bin/sh | 是shell命令的软链接(已被/bin/bash所替换) |
/usr/bin/bash | centos 和redhat 系统默认使用的bash |
/bin/bash | 基准于FNU的框架下发展出的shell |
/usr/sbin/nologin | 让用户无法登陆主机 |
/sbin/nologin | 软连接 |
/bin/csh | 已经被/bin/bash所替换(整个c shell ,提供更多的功能) |
/bin/tcsh | csh的增强版,与csh完全兼容,整合了csh,提供更多的功能 |
shell脚本就是把原来的linux命令或语句放在一个文件中,然后通过这个程序文件去执行,我们就说这个程序为shell 或者脚本。
将需要执行的命令保存到一个文件中,按照顺序执行,它不需要编译,它是解释型的。
自动化完成软件的安装部署
自动化完成系统的管理,如批量添加用户
自动化完成备份,如数据库定时备份
自动化的分析处理,如网站访问量
应用场景
第一行为 “ #!/bin/bash ” ,脚本申明(默认解释器)
注释信息
可执行语句
输出结果如下:
写好shell脚本之后可以进行脚本的调试
用户通过操作系统处理信息的过程,包括以下几类交互设备文件
标准输入(STDIN):默认的设备是键盘, 文件编号为0 ,命令将从标准输入文件中读取在执行过程中需要的输入数据
标准输出(STDOUT):默认的设备是显示器, 文件编号为1 ,命令将执行后的输出结果发送到标准输出文件。
标准错误输出(STDERR):默认的设备是显示器, 文件编号为2 ,命令将执行期间的各种错误信息发送到标准错误文件。
类型 | 操作符 | |
---|---|---|
重定向输入 | < | 从指定文件读取数据 |
输入完后停止指定符号停止 | << | 在向文件输入内容时,加上此符号可定义输入结束的符号(符号基本为 |
重定向输出 | > | 将输出结果保存到指定文件(覆盖原有内容) |
>> | 将输出结果追加到指定文件尾部 | |
标准错误输入 | 2> | 将错误信息保存到指定文件(覆盖原有内容) |
2>> | 将错误信息追加到指定文件 | |
混合输出 | &> | 将标准输出、错误输出的内容保存到同一文件 |
解释: 就是使用了重定向输入,可以将一个文件的内容输入到别你想要接收的地方,不需要再进行手动输入
例1:免交互修改密码
例2:与cat命令结合使用
将某个文件的内容输入到cat的标准输入中,cat获取到后,再显示到终端上
错误重定向指的是将执行命令过程中出现的错误信息(如选项获参数错误等)保存到指定的文件,而不是直接显示在屏幕上,错误重定向使用“ 2> ” 操作符。
作用
PS:/dev/null:把它看做黑洞,所有写入它的内容都会永远丢失,而尝试从它哪里读取内容,则什么也读不到。
&> 和 >& 符号
例1:输出错误消息到指定文件中
例2:把正确和错误的消息输入到相同的位置
把标准输出,重定向到错误输出里面
把错误输出重定向到标准输出里面
管道(pipe)操作为不同命令之间的协同工作提供了一种机制,位于管道符号 “ | ” 左侧的命令输出的结果 ,将作为 **右侧命令的输入 **(处理对象),同一命令中可以使用多个管道。
变量的作用 :用来存放系统和用户需要使用的特定参数(或值)
变量的类型
格式:变量名=变量值(注意=两边不要有空格)
取消变量的定义:unset 变量名
变量名称需要以字母或下划线开头,名称不要包含特殊字符(如:+、-、*、/、.、?、%、&、#等)
通过在变量名称前添加前导符号 “ $” ,可以引用一个变量的值,使用echo命令查看变量,也可以同时查看多个变量值。变量名称需要以字母或下划线开头,名称不要包含特殊字符(如:+、-、*、/、.、?、%、&、#等)
通过在变量名称前添加前导符号 “ $” ,可以引用一个变量的值,使用echo命令查看变量,也可以同时查看多个变量值。
当变量名称容易跟紧跟其后其它字符混淆时,需要添加大括号“ {} ”,将其括起来,否则无法确定正确的变量,对于未定义的变量,将显示为空值。
echo常用的选项
允许通过$符号引用其它变量值
双引号主要为界定字符串的作用,特别是当要赋值的内容中包含空格时,必须以双引号括,其它情况下通常可以省略
可以定义一个变量,将这个变量改为用户输入的值。
常用选项
选项 | 功能 |
---|---|
-p | 提示用户的信息 |
-n | 定义字符数 |
-s | 不显示用户输入的内容,常用于输入密码 |
-t | 定义超时时间,超过多长时间没输就自动退出 |
使用脚本进行解释 -p选项
默认的情况下,新定义的变量只是在当前的shell环境中有效,因此是局部变量,当进入子程序或子shell环境时,局部变量将无法再使用。
为了使用用户定义的变量在所有的子shell环境中能够继续使用,减少重复设置功能,可以通过内部命令export将制定的变量到处为全局变量,用户可以同时指定多个变量名称作为参数(无须使用" $ "符号),多个变量名之间以空格分隔
使用export导入为全局变量时,也可以为变量进行复制,这样就有新定义全局变量时就不需要提前进行复制了,
环境变量指的是处于运行需要而由Linux系统提前创建的一类变量,主要用于设置用户的工作环境,会随着用户状态的改变而改变。
使用env 命令可查看到当前工作环境下的环境变量,对于常见的一些环境变量应了解其各自的用途
USER: 表示用户名称; HOME: 表示用户的宿主目录; LANG: 表示语言和字符集; PWD: 表示当前所在的工作目录; PATH: 表示命令搜索路径等; RANDOM: 表示随机数,会返回0-32767的整数。
PATH 变量
用于设置可执行的默认搜索路径,当仅指定文件名称来执行命令程序时,Linux系统将在PATH变量指定的目录范围查找对应的可执行文件。
解释:就是说有执行文件的话,想要直接执行这个文件,那么这个文件的路径需要在$PATH里面,如果不在,想要执行,必须加上路径才可执行。
注意:修改$PATH需要谨慎操作,如果找不到了会影响其它命令的使用!!
shell变量中有一种特殊情况,一经设定,其值是不可改变的,这种变量被称为只读变量。
在创建的时候可以将其设置为只读属性,也可以将已存在的变量设置为只读属性,只读变量主要用于变量值不允许被修改,不能被删除。
当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次复制给位置变量。
位置变量也称位置参数,使用$1、$2、$3、$4…$9表示,命令或脚本本身的名称使用" $0"表示
使用脚本写一个创建用户并且修改密码
预定义变量是由Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接预定义变量赋值,预定义变量使用“ $ ”符号和另一个符号组合表示。
预定义变量 | 功能 |
---|---|
$# | 表示命令行中位置参数的个数 |
$* | 表示所有位置的内容,这些内容当做一个整体 |
$@ | 表示列出所有位置参数,但是是以单个的形式列出 |
$? | 表前一条命令执行后的返回状态,返回值为0,表示执行正确,返回任何非0值均表示执行出现异常 |
$0 | 表示当前执行的脚本或程序的名称 |
$$ | 表示返回当前进行的进程号 |
$! | 返回最后一个后台进程的进程号 |
理解 “ $* ” 和 “ $@ ” 的区别
在Bash Shell 环境中,只能进行简单的整数运算,不支持小数运算。
整数值的运算主要通过内部命令expr进行, 运算符与变量之间,必须有至少一个空格 ,不仅可以进行运算,还支持输出到屏幕
$(()) 和 $ [] 必须要和echo在一起用 ,因为它只能运算无法输出结果,这两个运算符号之间,不需要使用$符号引用变量,可直接使用表达式。
let的运算可以改变变量本身的值,但是不显示结果,需要echo。
shell的作用:主要是为了自动化操作
注意shell的命令,要以.sh结尾,在脚本中需要注入解析器,默认的解析器为:#!/bin/bash,shell的执行有多种方式,可以使用绝对路径或相对路径进行执行脚本,但是此方法需要加上执行权限,如果不加执行权限,可以使用bash、sh、source命令进行执行
重定向
有标准输入(stdin)、标准输出(stout)、错误输出(stderr)
" > ": 表示标准重定向输出,可以结合cat手动输入一些信息,输入完,会覆盖以前的内容
“ >> ”:表示重定向输出,将手动输入的内容重定向追加到文件中
“ < ” :表示重定向输入,结合cat使用时,可以将文件中的内容输入到cat中,然后cat将内容输出
“ << ” :表示以设么字符进行结尾,大部分使用的是EOF
“1>&2” :表示将标准输出,混合到错误输出里面
“2>&1” :表示将错误输出,混合到标准输出里面
管道符号 “ | ”
自定义变量
可以使用echo 加参数进行输出。有时候变量输出要和普通内容在一起输出,可以使用${} 将变量名进行引用用于区别的内容。
单引号的作用( ‘ ’ ) : 表示引号的内容就是要输出的内容,不会转变引号的内部
双引号的作用(“ ”): 表示引号的内容进行输出,但是内部的变量会进行输出,echo默认就是双引号,平常echo输出的内容有空格时,可以加上双引号标注。
单撇号的作用(``): 表示单撇号中的内容,必须是可执行的命令,但是这种无法进行嵌套,所以还可以使用$() 进项嵌套输出,从内往外进行输出。
交互式定义变量: 使用read 可以将变量从用户手从获取到,与用户进行交互,加上-p 可以输入交互提示信息,-t,用户输入变量内容时,不显示出来
**变量的作用范围: **变量作用范围,在当前的shell环境中,如果使用bash开启一个子shell,那么它的父进程shell的变量将无法使用,可以使用命令export 将局部变量加入到全局变量中,
特殊变量
环境变量: 为系统自动生成的变量名,不同的变量名代表不同的含义,且跟随用户状态而改变,其中 $ PATH表示命令可以生成的变量路径,当我么执行一个命令的同时,他会搜索$PATH下的命令
只读变量: 变量只能读取不能修改或删除,可以使用readonly 加上变量名即可生成
位置变量: 使用$1 ,$2 ,$3…等表示位置变量,$0表示脚本名称,位置变量需要用户在执行脚本的时候进行输入。
expr命令: 不仅可以进行运算,还可以进行显示输出,需要注意的是,运算符两边需要有空格,不然会进行报错。
使用expr命令,基本进行,+、-、*、/、%、操作
运算符号运算: $[] 或者 $ (( )) 这两个括号内容都可以进行运算,但是它只会进行运算,不能输出结果,所以需要结合echo 进行输出。并且括号中可以不用使用$符号进行申明变量,可直接使用变量值。
let命令: let命令可以进行改变量值的本身,相当于对变量自身做出运算,然后再赋值给自身,
修改或删除,可以使用readonly 加上变量名即可生成
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。