Linux从入门到精通5

xiaoxiao2025-10-14  6

10shell基础编程1

10.1 Shell基础-概述

把我们的操作命令,翻译成内核可以识别的0101语言,然后内核会把操作结果返回给shell,经解释返回给我们 widows也有shell,图形交互界面就是它的shell 让我有个地方可以输命令 除了作为接受用户的命令 ,也可以作为一种编程语言 Bash Shell 最后一列是用户的登陆后的权限

10.2 Shell基础-脚本执行方式

基本上程序必须用路径来执行,有的命令不需要其实是一种简化操作 方式二:直接用bash命令,连权限都不用赋 这个脚本文件是在window中编辑成功的 所以要把脚本从windows格式转化为linux格式

10.3.1 Shell基础-Bash基本功能-历史命令与补全

10.3.2 Shell基础-Bash基本功能-别名与快捷键

所有的命令其实都是靠路径来执行的 ls可以不打路径,是因为4 cd是bash自带的,根本没有路径 用命令行定义的别名重启会失效

10.3.3 Shell基础-Bash基本功能-输入输出重定向

date覆盖了ls 追加上了 2和<<没有空格

执行但不输出,即把输出扔到垃圾桶 执行操作的命令本来应该通过键盘写入,但是现在 通过文件来 ctrl+d

10.3.4 Shell基础-Bash基本功能-多命令顺序执行与管道符

就算中间有报错,也不会影响后面的命令的执行 我们就可以知道执行一个命令传100M需要用多长时间

10.3.5 Shell基础-Bash基本功能-通配符和其他特殊符号

2:删除当前目录下的所有文件 通配符用来匹配文件名 单引号和双引号的区别。单引号是原样输出、双引号才是代表

反引号和$()的区别

$失去作用

通配符:匹配内容 单引号和双引号:单引号括起来的内容没有特殊符号,双引号括起来的内容会有特殊符号 反引号和$():括起来的是系统变量

10.4.1 Shell基础-Bash变量-用户自定义变量

set可以查看到系统中所有的变量

10.4.2 Shell基础-Bash变量-环境变量

从上到下,限制的越来越严格

年龄和性别在子shell中还在,但是名字不在了 执行命令要想运行,要用路径 但是系统路径并没有写路径,就能运行 敲入一个命令后,就在path中去找 小写w显示出了完整的路径 第8条命令 可以按照自己的习惯来该提示符 但是还是默认的比较习惯

10.4.3 Shell基础-Bash变量-位置参数变量

位置参数变量的变量名称和作用是固定的 输出后面参数的结果 带上参数后就能将参数输出了 $用来接收参数 脚本中没有提示让用户输入两个参数才能运行,没有输入参数的话怎么办呢? 把命令行中的参数传递到脚本中

还要设定执行权限哟 *所有的参数看成一个整体 @区分对待

第一个循环把所有的参数当成一个整体 第二个参数把每个参数当成一个独立的参数 可以在命令执行的同时写入参数

10.4.4 Shell基础-Bash变量-预定义变量

命令找不到时报错设定为127 文件找不到报错为2 &代表后台执行 最小化其实就是放入后台, 显示当前进程的id,显示后台进程的id

10.5.1 Shell基础-Bash变量-数值运算与运算符

这是因为默认的类型是字符串类型 两个小括号代表要用数值运算 越靠上优先级越高

10.5.2 Shell基础-Bash变量-变量测试与内容替换

通过判断x的值,来判断y是否有值。 y不存在,x就等于一个新值。 y存在但为空,x也为空。 y有值,x就等于y。

减号 冒号 加号 减号 等号:不光给x赋值,还要给y 问号:值不存在时,输出 给用户看

10.6.1 Shell基础-环境变量配置文件-简介

环境变量:在一系列的shell中生效,还有默认环境变量。 环境变量的配置文件:专门用来放环境变量的文件 如果修改了配置文件,source让强制生效 path:命令的路径 histsize:历史命令保存条数 psi:提示符 hostname:主机名 临时生效 etc:对所有登陆系统的用户都有效 ~:家目录,只对当前用户有效,这两个是隐藏文件用.开头

10.6.2 Shell基础-环境变量配置文件-作用

用户登录后首先调用etc/profile etc/profile/*.sh

/etc/profile

:用户输入用户名和密码后,第一步读取了/etc/profile文件 判断出管理员,所以让它读那几个 默认的权限 umask 最主要的是读取定义语言的这个脚本 中文编码环境

XXX/.bash_profile

这个文件如果存在就调用,然后给path中追加一个自己本身用户的bin

XXX/.bashrc

定义了系统别名,调用下一个文件

/etc/bashre

很多都重复了,比如说umask等等。只要是重复的值,都是定义的不需要输入用户名和密码的那种情况生效。

10.6.3 Shell基础-环境变量配置文件-其他配置文件和登录信息

之前讲过查历史命令 欢迎信息,

加一个/l 因为linux本地支持6个终端,用alt+Fn来切换,加上\l可以知道当前是哪个。但这只对本地linux有效 这下欢迎信息出现了,但不支持 这是登陆后的欢迎信息 本地终端必须安装中文插件才能支持中文,cch,con等等

11shell基础编程2

11.1 Shell编程-正则表达式

通配符:* ? []。匹配文件名,因为一些命令不支持正则表达式。完全匹配 正则:在文件中匹配字符串,一些命令支持正则表达式。包含匹配 完全匹配 只要含有size就会列出 ,包含匹配 匹配包含a的所有字符,即a出现0次或者任意多次。即列出了整个文档 aa匹配有一个连续的a出现 aaa匹配有两个连续的a出现 相当于通配符中的? .*匹配任意字符,任意个数 匹配空白行 只要有字符结尾 最少一个a最多两个a

11.2.1 Shell编程-字符截取命令-cut命令

grep是提取行 cut是提取列 中间的是制表符而不是空格 默认分隔符是制表符 冒号作为分隔符 结合使用grep和cut 只有普通用户有/bin/bash 管理员是/sbin/nologin 写一个脚本,如果使用率大于80%报警 完全没有作用,是因为这个分隔符是多空格不是制表符 用-d指定分隔符是空格也不行,它制定了一个空格的分隔符,它认为第五列是空格 以为用awk命令来实现

11.2.2 Shell编程-字符截取命令-printf命令

cut提取字符段 标准输出格式,用来支持awk命令 只有第一个%s起了作用,需要用’'把%s们括起来 printf不能直接输出文件名中的内容 因为awk里面不能使用cat等显示,必须得用printf

11.2.3 Shell编程-字符截取命令-awk命令

cat vi等都不用我们手动调整格式 cat不能截取以空格作为分隔符的输出结果 而awk可以 awk命令很复杂,不仅可以进行字符截取,还可以编程 第2列 制表符 第6列 换行 cat命令不能处理df这样的结果,是因为里面是空格符 而awk可以 超过80%就报警 在执行之前打印出 指定分隔符 但是第一行没有处理,是因为awk是读完第一行之后才开始执行处理 这表示在我读取第一行命令之前,就把分隔符写进去 在所有的命令都执行完后执行的一条命令 awk命令比较复杂

11.2.4 Shell编程-字符截取命令-sed命令

cut、printf、awk都是进行字段提取的 printf是进行行提取 cut和awk是进行列提取 sed命令时用来进行流编辑器 vi只可以修改文档 sed不光可以修改文件,可以从管道符接收数据来修改,可以直接修改命令的结果 sed在写shell脚本时很重要 其实系统命令也支持/,它会认为你这个命令没有输完,等待你执行接下来的命令。 进行数据替换时也可以用/。 p是输出,2p就是输出第二行 它不光把第二行输出了,还把所有的内容都给输出了一遍,即第二行输出了两遍 如果只想看第二行,而不想得到全部的内容,那么就需要加-n选项。 所以一般用p选项打印的话,都要加上-n。 注意,只要不加-i,所有的操作都不影响文件本身,只影响了屏幕输出。 我们来看看除了操作文件本身,它还可以来干什么。 放到管道符之后,它还可以接收命令的结果。 这个文件就只有4行,我删掉2~4行,那么就只剩下第一行的数据了,直接输出剩余的结果。 但是并没有把文件的内容真正的给删除掉,只要不加-i。 a代表追加 i代表插入 /表示一行还没输完,还要接着输入 在第二行的前面插入了。 \允许多行的输入。追加、替换、插入都允许多行输入。 要想保存在文件中,加-i,这时候没有输出,但是cat文件,输出了结果。 -e是允许多个命令同时执行,用;分开

11.3 Shell编程-字符处理命令

允许手工指定分隔符,还是排序,但是不是按照整个文件行首的字母排序了,而是手工指定以:作为分隔符,然后用第三个字段开始到第三个字段结束排序,其实就是使用第三个字段来排序, 这时候就会发现会从用户的uid来排序 没把整个uid当成是字符串,而是按首字符来排序的,所以前面是1 10 11而2 3都在后面。 为了能够让它识别这些数字的大小,需要加-n。意思是把提取出来的字符串当做数值型的来计算。 依次是行数、单词数、字符数 还可以统计命令的输出

11.4 Shell编程-条件判断

测试一个条件是否成立 块设备文件、字符设备文件、管道文件、套接字文件都是一些特殊的文件类型 常用的就是目录文件、普通文件、文件是否存在 怎么没有输出结果呀,可以通过echo来判断上一条命令是否执行正确,0是正确1是错误。 test和[]都可以,[]更为常用。 为什么需要这种方式来判断在不在?因为ls是给用户看,而test这种是给程序来看。 双&&符是逻辑与,这样可以不用再手动输出执行结果 root是存在,但它不是普通文件,而是目录文件。 读写执行 不管是所有者、所属组、其他人,只要有一个有w权限,就会说它有写权限 硬链接:文件1,2做了硬链接,文件名可以随便改,只有inode号可以判断他们是否是同一个文件 软链接:会有箭头表明它的源文件 把它们做为硬链接。 只要一个方法,看他们的inode号。这是需要人为肉眼,要想让程序要判断。 判断是否为空,是yes否no eq来判断是判断数值,==适用于字符

11.5.1 Shell编程-流程控制-if语句

如果分区超过了80%,那么就警告 把这个数值提出来 grep提取行 awk提取列 截取字符串,以百分号作为分隔符 备份就是从原始位置赋值一份到别的位置 如果这个目录存在 把当前的日期输出到一个临时文件中,覆盖。将文件大小追加到临时文件中 进入这个备份的位置,将刚刚那个临时文件进行压缩 如果目录不存在,手动创建这个目录,然后一样 每隔15分钟执行一次,如果服务器down了,就会主动告诉你并且帮你重启服务器 如何判断一个服务是运行的 用ps命令查看现在的进程 提取有没有apacher的进程 我们现在把apche装上 装完启动一下 启动完查,证明运行了 有些情况下虽然有进程但是死机了,用ps判断不一定准,别的方法 还有一种方法是判断端口,只要看到80端口,就说明apache启动了,但是也不准

最有效的方法是通过nmap命令,远程扫描命令,如果它能连接上apche则会返回状态 我们来安装nmap -sT扫描指定服务器上开启的TCP端口 现在要做的是,截取这个命令的输出 排除干扰项 只提取包含TCP的行 然后再提取包含服务器的行 截取第二段 然后把这个执行的结果赋给变量,写语句 如果关着,把输出结果丢到垃圾箱,然后重启 现在启动了,所以现在正确的访问日志有了 停掉apche 接下来的任务就是定时让它运行 -e是文件为真,!取反

11.5.2 Shell编程-流程控制-case语句

多分支判断语句 case:只能有一种判断关系 打印选择列表的情况 *不用打双引号!去掉 这个变量是否是这个值还是那个值

11.5.3 Shell编程-流程控制-for循环

把所有的包放在了lamp目录中,把所有后缀名为压缩包的都放到ls.log这个文件中 循环执行,解压,把执行结果信息输出到垃圾站中 这种for循环的好处:不需要事先执行循环的个数 用双小括号括起来才允许进行加减乘除运算 事先知道要添加多少个用户,用到第二种循环 用户名、个数、初始密码 先要判断输入的名字、个数、初始命令不为空,才能往下执行 还要判断输入的num是数字,sed是正则表达式,包含匹配。如果是数字替换为空,如果y为空,则证明为数字 循环num次,添加用户st1 st2 … 结果: 脚本没有执行

11.5.4 Shell编程-流程控制-while循环与until循环

少加了个100 不成立则执行循环,直到 在执行的同时进行编译,但是效率 要慢

怎么建立编程思想:多练

转载请注明原文地址: https://www.6miu.com/read-5037918.html

最新回复(0)