掌握Shell:从新手到编程大师的Linux之旅
1 shell介绍
1.1 shell脚本的意义
1.记录命令执行的过程和执行逻辑,以便以后重复执行
2.脚本可以批量处理主机
3.脚本可以定时处理主机
1.2 脚本的创建
#!/bin/bash # 运行脚本时候执行的环境


1.3 自动添加脚本说明信息
/etc/vimrc # vim主配置文件
~/.vimrc # 该用户环境下的文件
autocmd BufNewFile *.sh,*.script call NOTE()
func NOTE()call append(0,"####################")call append(1,"# Author: sxl")call append(2,"# Version: ")call append(3,"# Create_Time: ".strftime("%Y/%m/%d"))call append(4,"################################################")call append(5,"#!/bin/bash")
endfunc

1.4 执行shell脚本
当脚本没有可执行权限时候
1.4.1 手动在环境中开启指定解释器
sh script.sh

1.4.2 直接在当前环境中运行shell中的指令不开启新的shell
source script.sh
. script.sh

当脚本有可执行权限时候
1.4.3 开启脚本中指定的shell并使用此shell环境运行脚本中的指令
chmod +x script.sh
/xxx/xxx/script.sh
./script.sh

1.5 调试
sh -x /mnt/westos.sh # 进入debug模式
+ ##运行指令
不带+ ##命令运行的输出

2 shell变量
2.1 变量的定义
- 变量就是内存一片区域的地址
- 变量定义的规范性
2.1.1 变量名称
可包含:
字母
下划线_
数字
不能用数字开头
建议:
变量名称短全用大写字符
变量名称长用_区分子类
WESTOS
Westos_Linux
westoS_Linux
2.2 不同级别的变量设定
2.2.1 环境变量
export a=1
在环境关闭后变量失效

2.2.2 用户级别
vim ~/.bash_profile
export a=1

2.2.3 系统级别
vim /etc/profile
export a=2
vim /etc/profile.d/westos.sh
export b=3


2.3 变量转义
2.3.1 转译
\ #转译单个字符
"" #弱引用,批量转译个数字符 不能转译"\ " "" "$" "!"
'' #强引用

2.3.2 声明变量及其引用
a=1
echo ${a}b

2.3.3 变量数组的使用
a=(1 2 3 4 5)
a$[a[@]:起始元素id:元素个数]
echo ${a[0]} ##数组中第一个元素
echo ${a[1]} ##数组中最后一个元素
echo ${a[*]} ##数组中所有元素
echo ${a[@]} ##数组中所有元素
echo ${a[@]:0:3} ##数组中13个元素
echo ${#a[@]} ##数组中元素的个数
unset a[n] ##删除数组中的第n1个元素
unset a ##删除a这个数组

2.4 命令的别名设定alias
alias xie='vim' ##临时设定
vim ~/.bashrc
alias xie='vim' ##只针对与用户生效
vim /etc/bashrc ##针对系统所以用户生效
alias xie='vim'
unalias xie ##删除当前环境中的alias

2.5 用户环境变量的更改
设定方式:
~/.bash_profile # 当前用户环境变量
export PATH=$PATH:/mnt
/etc/bash_profile # 整个系统变量
export PATH=$PATH:/mnt

2.6 直接利用命令执行结果
$()##优先执行
TIME=`date` # 范围更广

2.7 脚本中的传参
2.7.1 非交互式
非交互模式:
$0 is /mnt/test.sh <!脚本本身>
$1 is westos <!脚本后所输入的第一串字符>
$2 is linux
$3 is redhat
$* is westos linux redhat <!脚本后所输入的所有字符"westos linux redhat">
$@ is westos linux redhat <!脚本后所输入的所有字符'westos' 'linux' 'redhat'>
$# is 3 <!脚本后所输入的字符串个数>

2.7.2 交互式
read WESTOS ##对westos赋值
read -p "please input word:" ##输出提示语
-s ##隐藏输入内容

2.8 脚本函数
设定方式:
WORD()
{
action1
action2
}
WORD 在脚本中就代表action1 action2这两个动作


3 shell编程流程
3.1 for
for i in 1 2 3 4 5 sxl
doecho $i
done
echo "################"
for i in `seq 1 2 5` # 步长为2
doecho $i
done
echo "################"
for i in {1..5}
doecho $i
done
echo "################"
for ((i=6;i<10;i++))
doecho $i
done


3.2 条件
3.2.1 while do

3.2.2 until do

3.2.3 if

3.3 case
执行按钮操作,点名机制,相对于IF语句效率更高
case $1 in
word1|WORD1)
action1
;;
word2|WORD2)
action2
;;
*)
action3
esac

3.4 expect
3.4.1 shell应答方式
问题expect.sh
#!/bin/bash
read -p "what's your name:" NAME
read -p "How old are you: " AGE
read -p "Which objective: " OBJ
read -p "Are you ok? " OK
echo $NAME is $AGE\'s old study $OBJ feel $OK
回答answer.sh
/root/Desktop/expect.sh <<EOF
SXL
20
REAHAT
OK
EOF


3.4.2 expect应答方式
dnf install expect -y
#!/usr/bin/expect
set timeout 1
set NAME [ lindex $argv 0 ]
set AGE [ lindex $argv 1 ]
set OBJ [ lindex $argv 2 ]
set FEEL [ lindex $argv 3 ]
spawn /mnt/ask.sh
expect {
"name" { send "$NAME\r";exp_continue }
"old" { send "$AGE\r";exp_continue }
"objective" { send "$OBJ\r";exp_continue }
"ok" { send "$FEEL\r" }
}
expect eof


4 shell运算
4.1 运算符号
+ ##加法
- ##减法
* ##乘法
/ ##除法
% ##除法后的余数
** ##乘方
++ ##自加一
-- ##自减一
< ##小于
<= ##小于等与
> ##大于
>= ##大于等与
>= ##等于
+= j+=i ##j=j+i
*= *##j=j*i
/= ##j=j/i
%= ##j=j%i

4.2 运算指令
(()) ##((a=1+2))
let ##let a=1+2
expr ##expr 1 + 2
bc
bc << EOF
1+2
EOF
$[] ##echo $[1+2]
printf '%0.2f' .3 ==== 0.30
printf '%0.3f' .3 ====0.300
printf '%0.4f' .3 ====0.3000


5 脚本练习
5.1 IP采集
ifconfig $* | awk '/inet\>/{print $2}'

5.2 日志清理
[ "$USER" = "root" ]&&{echo clean ok> /var/log/message
}||{echo clean error
}

5.3 采集系统登录用户信息
echo -e "hostname:\t$(hostname)"
echo -e "hostname:\t$HOSTNAME"
echo -e "username:\t$USER"
IP=$(ifconfig ens160 | awk '/inet\>/{print $2}')
[ -z "$IP" ]&&{echo -e "ipaddress:\tNONE"
}||{echo -e "ipaddress:\t$IP"
}

5.4 脚本函数创建用户
ACTION()
{read -p "please name:" NAME[ "exit" = "$NAME" ]&&{exit}id $NAME &> /dev/null &&{echo "user exit"ACTION}||{echo "user not exit"read -p "please input passwd:" PASSWDadduser $NAMEecho $PASSWD | passwd --stdin &> /dev/null &&{echo "$NAME create ok"}ACTION}
}
ACTION

5.5 检测直连网络中可以与主机通信的主机IP
for ip in {50..64}
doping -w 1 -c 1 192.168.1.$ip &> /dev/null &&{echo 192.168.1.$ip}
done

5.6 用户建立脚本
5.7 系统CPU使用情况
ps ax -o %cpu | awk 'BEGIN{N=0}!/$CPU|0.0/{N+=$1}END{print "%CPU:\t"N"%"}'

5.8 倒计时
MIN=1
SEC=60
SECS=$[MIN*60+SEC]
for ((;SECS>0;SECS--))
doMIN=$[SECS/60]SEC=$[SECS%60]echo -ne "$MIN:$SEC"echo -ne '\r'sleep 1
done

相关文章:
掌握Shell:从新手到编程大师的Linux之旅
1 shell介绍 1.1 shell脚本的意义 1.记录命令执行的过程和执行逻辑,以便以后重复执行 2.脚本可以批量处理主机 3.脚本可以定时处理主机 1.2 脚本的创建 #!/bin/bash # 运行脚本时候执行的环境1.3 自动添加脚本说明信息 /etc/vimrc # vim主配置文件 ~/.vimrc # 该…...
有重复元素的快速排序
当涉及到处理重复元素的快速排序时,可以使用荷兰国旗问题的方法,也就是三路划分。下面是使用 Java 实现的示例代码: import java.util.Arrays;public class QuickSort {public static void quickSort(int[] arr, int low, int high) {if (lo…...
Bert浅谈
优点 首先,bert的创新点在于利用了双向transformer,这就跟openai的gpt有区别,gpt是采用单向的transformer,而作者认为双向transformer更能够融合上下文的信息。这里双向和单向的区别在于,单向只跟当前位置之前的tocke…...
产品运营的场景和运营策略
一、启动屏 1.概念 启动屏,特指 APP 产品启动时即显示的界面,这个界面一般会停留几秒钟时间,在这个时间内 APP 会在后台加载服务框架、启动各种服务 SDK 、获取用户地理位置、判断有无新版本、判断用户账户状态以及其他系统级别的…...
C#异常捕获try catch详细介绍
在C#中,异常处理是通过try、catch、finally和throw语句来实现的,它们提供了一种结构化和可预测的方法来处理运行时错误。 C#异常基本用法 try块 异常处理以try块开始,try块包含可能会引发异常的代码。如果在try块中的代码执行过程中发生了…...
切换阿里云ES方式及故障应急处理方案
一、阿里云es服务相关问题及答解 1.1 ES7.10扩容节点时间 增加节点数量需要节点拉起和数据Rebalance两步,拉起时间7.16及以上的新版本大概10分钟以内,7.16以前大概一小时,数据迁移的时间就看数据量了,一般整体在半小时以内 (需进行相关测试验证) 1.2 ES7.10扩容数据节点…...
CTFhub-RCE-过滤空格
1. 查看当前目录:127.0.0.1|ls 2. 查看 flag_890277429145.php 127.0.0.1|cat flag_890277429145.php 根据题目可以知道空格被过滤掉了 3.空格可以用以下字符代替: < 、>、<>、%20(space)、%09(tab)、$IFS$9、 ${IFS}、$IFS等 $IFS在li…...
无需添加udid,ios企业证书的自助生成方法
我们开发uniapp的app的时候,需要苹果证书去打包。 假如申请的是个人或company类型的苹果开发者账号,必须上架才能安装,异常的麻烦,但是有一些app,比如企业内部使用的app,是不需要上架苹果应用市场的。 假…...
【PTA题目】6-20 使用函数判断完全平方数 分数 10
6-20 使用函数判断完全平方数 分数 10 全屏浏览题目 切换布局 作者 张高燕 单位 浙大城市学院 本题要求实现一个判断整数是否为完全平方数的简单函数。 函数接口定义: int IsSquare( int n ); 其中n是用户传入的参数,在长整型范围内。如果n是完全…...
Nas搭建webdav服务器并同步Zotero科研文献
无需云盘,不限流量实现Zotero跨平台同步:内网穿透私有WebDAV服务器 文章目录 无需云盘,不限流量实现Zotero跨平台同步:内网穿透私有WebDAV服务器一、Zotero安装教程二、群晖NAS WebDAV设置三、Zotero设置四、使用公网地址同步Zote…...
一句话总结敏捷实践中不同方法
敏捷实践是指一组优先考虑灵活性、协作和客户满意度的软件开发和项目管理原则和方法。 不同方法论的敏捷实践: 1、敏捷: Sprints:限时迭代(通常 2-4 周),在此期间创建潜在的可交付产品增量。每日站立会议…...
【数据结构】线段树(点修区查)
数据结构-线段树(点修区查) 前置知识 分治递归二叉树 思路 我们需要维护一个支持单点修改,区间查询的数据结构,并且要求在线,一般使用线段树解决。 线段树是一个二叉树形的数据结构。 线段树的思想很简单,…...
Ansys Lumerical | 用于增强现实系统的表面浮雕光栅
在本示例中,我们使用 RCWA 求解器设计了一个斜面浮雕光栅 (SRG),它将用于将光线耦合到单色增强现实 (AR) 系统的波导中。光栅的几何形状经过优化,可将正常入射光导入-1 光栅阶次。 然后我们将光栅特性导出为 Lumerical Sub-Wavelength Model …...
QT day3作业
1.思维导图 2、 完善对话框,点击登录对话框,如果账号和密码匹配,则弹出信息对话框,给出提示”登录成功“,提供一个Ok按钮,用户点击Ok后,关闭登录界面,跳转到其他界面 如果账号和密…...
【Ubuntu】设置永不息屏与安装 dconf-editor
方式一、GUI界面进行设置 No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.6 LTS Release: 20.04 Codename: focal打开 Ubuntu 桌面环境的设置菜单。你可以通过点击屏幕右上角的系统菜单,然后选择设置。在设置菜单中,…...
gRPC 的原理 介绍带你从头了解gRPC
gRPC 的原理 什么是gRPC gRPC的官方介绍是:gRPC是一个现代的、高性能、开源的和语言无关的通用 RPC 框架,基于 HTTP2 协议设计,序列化使用PB(Protocol Buffer),PB 是一种语言无关的高性能序列化框架,基于 HTTP2PB 保…...
Apriori算法
Apriori算法由R. Agrawal和R. Srikant于1994年在数据集中寻找布尔关联规则的频繁项集。该算法的名称是Apriori,因为它使用了频繁项集属性的先验知识。我们应用迭代方法或逐层搜索,其中k-频繁项集用于找到k1个项集。 为了提高频繁项集逐层生成的效率&…...
肖sir__linux讲解(2.1)
linux命令 cp 复制命令 a、cp 原文件名称 新文 件名称(不存在的文件) 案例:cp a k 截图: b.cp 原文件名称 原有文 件名称(存在的文件) 案例:cp a b 截图: c、cp 指定路径复制 格式ÿ…...
The ultimate UI kit and design system for Figma 组件库下载
Untitled UI 是世界上最大的 Figma UI 套件和设计系统。可以启动任何项目,为您节省数千小时,并祝您升级为专业设计师。 采用 100% 自动布局 5.0、变量、智能变体和 WCAG 可访问性精心制作。 900全局样式、变量:超级智能的全局颜色、排版和效…...
Selenium——利用input标签上传文件
Selenium利用input标签上传文件 完整流程 打开文件上传页面选择要上传的文件点击上传按钮确认文件上传成功介绍怎么方便的获取对应元素的Xpath或者Css 简单介绍 在使用Selenium进行浏览器自动化测试时,文件上传是一个常见的需求。而 标签就是实现文件上传功能的…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
