bash编程(马哥)
bash基础特性:
命令行展开:~,{}
命令别名:alias,unalias
命令历史:history
命令和路径补全:$PATH
glob通配符:*,?,[],[^],
快捷键:Ctrl+{a,e,l,c,u,k}
命令bash:
bash通配符及特殊符号:
通配符:
?:任意一个字符;
*:匹配任意个任意字符;
[]:匹配括号内的任意一个字符;
[^]:匹配非括号内的任意一个字符
特殊字符:
'':单引号中,所有特殊字符都没有特殊含义;
"":双引号中,除$(调用变量的值)、`(命令引用)、\(转义符)外,其他特殊字符没有特殊含义;
` `:等同于$();达到命令引用,即先执行本处命令;
\:转义符,使跟\之后的特殊字符失去特殊含义;
$:调用变量的值;
#:在shell脚本中,#开头的行代表注释
bash脚本:
运行脚本:
1、给予执行权限,通过具体的文件路径指定文件执行;
2、直接运行解释器,将脚本作为解释器程序的参数运行;
数据类型:
一、字符
二、数值
1、整型
2、浮点型
(1)、单精度浮点型
(2)、双精度浮点型
3、布尔型
bash中的算术运算:man let
+,-,*,/,%
实现算术运算:(乘法符号有些场景中需转义\)
1、let var=算术表达式;例如 let sum=$num1+$num2
2、var=$[算术表达式];例如 echo $[$num1+$num2]
3、var=$((算术表达式));例如echo $(($num1+$num2))
4、var=$(expr arg1 arg2 arg3 …);例如sum=$(expr $num1 + $num2)
bash内建的随机数生成器:$RANDOM;
例如取出0-60之间# echo $[$RANDOM%60+1]
增强型赋值:man let;自增、自减:
+=,-=,*=,/=,%=
例如let count+=1、let count++
条件测试:判断某需求是否满足,需要有测试机制来实现;
测试命令:
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
bash的测试类型:
一、数值测试:
-gt:大于;
-lt:小于;
-ge:大于等于;
-le:小于等于;
-eq:等于;
二、字符串测试:(注意:用于字符串比较的操作数要使用引号)
==:等于;
>:大于;
<:小于;
!=:不等于;
=~:左侧字符串是否被右侧pattern所匹配;此表达式一般用于[[ ]]中;
-z “string”:字符串是否为空,空则为真,不空则为假;
-n “string”:字符串是否非空,非空为真,空则为假;
三、文件测试:(man bash)
-e file:存在测试;
-b file:存在且为块设备文件;
-c file:存在且为字符设备文件;
-d file:存在且为目录文件;
-f file:存在且为普通文件;
-g file:存在且拥有sgid权限;
-u file:存在且拥有suid权限;
-k file:存在且拥有sticky权限;
-r file:存在且可读;
-w file:存在且可写;
-x file:存在且可执行;
-s file:存在且非空;
-t fd:fd表示文件描述符是否已经打开且与某终端相关;
file1 -ef file2:是否为同一个设备上的相同inode;
file1 -nt file2:file1是否新于file2;
file1 -ot file2:file1是否旧于file2;
组合测试条件:
第一种方式:
command1 && command2
command1 || command2
! command
例如:[ -z “$(hostname)” ] || [ “$(hostname)” == “localhost.localdomain” ]
第二种方式:
expression1 -a expression2
expression1 -o expression2
! expression
例如:[ -z “$(hostname)” -o “$(hostname)” == “localhost.localdomain” ]
bash自定义退出状态码:
exit [n]:自定义退出状态码;
注意:脚本中一旦遇到exit命令,脚本会立即终止;终止状态码取决于exit命令后的数字;
注意:如果未给脚本指定状态退出码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码;
bash编程之用户交互:
read -p “提示语” 变量名
bash脚本编程:
整数值比较:-ge 大于等于; -gt 大于; -eq 相等; -lt 小于; -ne 不相等;-le小于等于
顺序执行
选择执行:if、case
循环执行:for、while、until
函数:结构化编程及代码重用;function
选择执行:if语句(逐条件进行判断;第一次遇到为“真”条件时,执行其分支,而后结束)
单分支:
if 判断条件;then
条件为真的分支代码
fi
双分支:
if 判断条件;then
条件为真的分支代码
else
条件为假的分支代码
fi
多分支:
if 判断条件1;then
条件为真的分支代码
elif 判断条件2;then
条件为真的分支代码
elif 判断条件3;then
条件为真的分支代码
…
else
条件为假的分支代码
fi
case语句:
case $变量名 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
*)
默认执行的命令序列
;;
esac
bash编程之for语句
循环执行:for语句
for 变量 in 列表;do
循环体
done
for循环的特殊格式:
for ((控制变量初始化;条件判断表达式;控制变量的修正表达式));do
循环体
done
控制变量初始化:仅在运行到循环代码段时执行一次;
控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断;
列表生成方式:
(1)直接给出列表;例如 for i in 1 2 3 4;then…
(2)整数列表:
(a){start..end};例如{1..10}代表1-10;
(b)$(seq [start [step]] end);例如:$(seq 1 2 10),代表10以内的奇数;
(3)返回列表的命令:$(COMMAND);例如$(ls /var)代表对列出/var目录下的文件列表;
(4)glob通配符
while语句:当条件为true时进入循环,条件为false时退出循环;
while 条件;do
循环体
done
while循环的特殊用法(遍历文件的每一行):依次读取/path/to/somefile文件中的每一行,且将行赋值给变量line;
while read line;do
循环体
done < /path/to/somefile
until语句:当条件为false时进入循环,条件为true时退出循环;
until 条件;do
循环体
done
创建死循环:
while true;do
循环体
done
until false;do
循环体
done
循环控制语句(用于循环体)
continue [n]:提前结束第n层的本轮循环,而直接进入下一轮判断;
break [n]:提前结束循环;
function函数
语法一:
function f_name {
函数体...
}
语法二:
f_name () {
函数体...
}
bash脚本编程:
变量:存储单个元素的内存空间;
数组:存储多个元素的连续的内存空间;
数组名
索引:编号从0开始,属于数值索引;注意:索引也可以使用自定义的格式,而不仅仅是数值格式;
bash的数组支持稀疏格式;
引用数组中的元素:${ARRAY_NAME[INDEX]}
数组长度(数组中元素的个数):
${#ARRAY_NAME[*]}、${#ARRAY_NAME[@]}
引用所有元素
${ARRAY_NAME[*]}、${ARRAY_NAME[@]}
取出特定元素:数组切片
${ARRAY_NAME[@]:offset:number}
offset:要跳过的元素个数
number:要取出的元素个数;去偏移量之后的所有元素:${ARRAY_NAME[@]:offset};
声明数组:
declare -a ARRAY_NAME
declare -A ARRAY_NAME:关联数组:
数组元素的赋值方式:
(1)一次只赋值一个元素:
ARRAY_NAME[INDEX]=VALUE
(2)一次赋值全部元素:
ARRAY_NAME=(“VALUE1” “VALUE2″ …)
(3)只赋值特定元素:
ARRAY_NAME=([0]=”VALUE1″ [3]=”VALUE3” …)
(4)让用户输入元素
read -a ARRAY
例子:随机生产10个数保存于数组中,找出最大和最小值;
declare -a nums
declare -i max=0
declare -i min=0
for i in {0..9};do
nums[$i]=$RANDOM
echo ${nums[$i]}
if [ $i -eq 0 ];then
min=${nums[$i]}
max=${nums[$i]}
else
if [ ${nums[$i]} -gt $max ];then
max=${nums[$i]}
fi
if [ ${nums[$i]} -lt $min ];then
min=${nums[$i]}
fi
fi
done
echo “max: $max”
echo “min: $min”
向数组中追加元素:ARRAY[${#ARRAY[*]}]
删除数组中的某元素:unset ARRAY[INDEX]
关联数组:
declare -a ARRAY_NAME
ARRAY_NAME=([index_name1]=”VALUE1″ [index_name2]=”VALUE2″ …)
bash的字符串处理工具:
字符串切片:
${var:offset:number}:
offset:要跳过的字符串个数
number:要取出的字符串个数;去偏移量之后的所有字符串:${ARRAY_NAME[@]:offset};
取字符串的最右侧几个字符:${var: -lengh};注意冒号后面必须有一空白字符;
基于模式去子串:
${var#*word}:其中word可以是指定的任意字符;功能:自左而右,查找var变量所存储的字符串中,第一次出现的word,删除字符串开头至第一次出现word字符之间的所有字符;
${var##*word}:其中word可以是指定的任意字符;功能:自左而右,查找var变量所存储的字符串中,最后一次出现的word,删除字符串开头至最后一次出现word字符之间的所有字符;
${var%word*}:其中word可以是指定的任意字符;功能:自右而左,查找var变量所存储的字符串中,第一次出现的word,删除字符串最后一个字符向左至第一次出现word字符之间的所有字符;
${var%word*}:其中word可以是指定的任意字符;功能:自右而左,查找var变量所存储的字符串中,第一次出现的word,删除字符串最后一个字符向左至最后一次出现word字符之间的所有字符;
例子:url=http://www.lewis.com:80
${url##*:}:80
${url%%:*}:http
查找替换:
${var/pattern/substi}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substi替换之;
${var//pattern/substi}:查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substi替换之;
${var/#pattern/substi}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substi替换之;
${var/%pattern/substi}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substi替换之;
查找并删除:
${var/pattern}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,删除之。
${var//pattern}:查找var所表示的字符串中,所有被pattern所匹配到的字符串,删除之。
${var/#pattern}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,删除之。
${var/%pattern}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,删除之。
字符大小写转换:
${var^^}:把var中的所有小写字母转换成大写;
${var,,}:把var中的所有大小字母转换成小写;
变量赋值:
${var:-value}:如果var为空或未设置,那么返回value;否则,则返回var的值;
${var:=value}:如果var为空或未设置,那么返回value,并将value赋值给var;否则,则返回var的值;
${var:+value}:如果var非空,则返回value;
${var:?error_info}:如果var为空或未设置,那么返回error_info;否则,则返回var的值;
为脚本程序使用配置文件:
定义文本文件,每行定义“name=value”
在脚本中source此文件即可
mktemp命令:创建临时文件或目录
-d:创建临时目录
–tmpdir:指明临时文件目录位置
例子:mktemp /tmp/test.XXX
install命令:功用类似cp命令
install [OPTION]… [-T] SOURCE DEST
install [OPTION]… SOURCE… DIRECTORY
install [OPTION]… -t DIRECTORY SOURCE…
install [OPTION]… -d DIRECTORY…
-m MODE:指明权限
-o OWNER:指明属主
-g GROUP:指明属组
ldd:查找某命令文件所依赖的共享库
ldd [OPTION]… FILE…
练习:写一个脚本
(1)提示用户输入一个可执行命令名称;
(2)获取此命令所依赖到的所有库文件列表;
(3)复制命令至某目录(例如/mnt/sysroot)下的对应路径下;
(4)复制此命令依赖到的所有库文件至目标目录下的对应路径下;
进一步:每次复制完成一个命令后,不要退出,而是提示用户键入新的要复制的命令,并重复完成完成上述功能:直到用户输入quit退出;
#!/bin/bash
#
ch_root=”/mnt/sysroot”
cmdcp() {
if which $1 &> /dev/null;then
cmd_path=$(which –skip-alias $1)
cmd_dir=$(dirname ${cmd_path})
[ -d ${ch_root}${cmd_dir} ] || mkdir -p ${ch_root}${cmd_dir}
[ -f ${ch_root}${cmd_path} ] || cp ${cmd_path} ${ch_root}${cmd_dir}
return 0
else
echo “command not found.”
return 1
fi
}
libcp() {
lib_list=$(ldd /usr/bin/bash | grep -o ‘/[^[:space:]]\+’)
for i in $lib_list;do
lib_dir=$(dirname $i)
[ -d ${ch_root}${lib_dir} ] || mkdir -p ${ch_root}${lib_dir}
[ -f ${ch_root}$i ] || cp $i ${ch_root}${lib_dir}
done
}
read -p “please input a command:” command
until [ $command == “quit” ];do
if cmdcp $command ;then
libcp$command
echo “job $command is finish”
read -p “please input a command:” command
else
read -p “please input a command:” command
fi
done
资料来源于马哥linux视频教程
相关文章:
bash编程(马哥)
bash基础特性: 命令行展开:~,{} 命令别名:alias,unalias 命令历史:history 命令和路径补全:$PATH glob通配符:*,?,[],[^], 快捷键&am…...
搭建Gerrit环境Ubuntu
搭建Gerrit环境 1.安装apache sudo apt-get install apache2 注意:To run Gerrit behind an Apache server using mod_proxy, enable the necessary Apache2 modules: 执行:sudo a2enmod proxy_http 执行:sudo a2enmod ssl 使新的配置生效,需要执行如下命令:serv…...
朋友去华为面试,轻松拿到26K的Offer,羡慕了......
最近有朋友去华为面试,面试前后进行了20天左右,包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说,80%的人都会栽在第一轮面试,要不是他面试前做足准备,估计都坚持不完后面几轮面试。 其实&…...
springboot项目如何配置启动端口
文章目录0 写在前面1 配置文件(.yaml)--推荐2 配置文件(.properties)3 IDEA配置--不推荐4 写在最后0 写在前面 项目启动需要一个独立的端口,所以在此记录一下。 根据配置文件的后缀书写格式略有不同。 1 配置文件(.yaml)–推荐 若是.yaml后缀的配置文件࿰…...
IOS - 抓包通杀篇
IOS中大多数情况,开发者都会使用OC提供的api函数,CFNetworkCopySystemProxySettings来进行代理检测; CFNetworkCopySystemProxySettings 检测函数直接会检测这些ip和端口等: 采用直接附加页面进程: frida -UF -l 通…...
盒子模型的简介
盒子的组成 一个盒子由外到内可以分成四个部分:margin(外边距)、border(边框)、padding(内边距)、content(内容)。会发现margin、border、padding是css属性,因…...
Kubernetes 101,第二部分,pod
在上一篇文章中,我们了解了Kubernetes 的基础知识以及对其主要架构的介绍。 介绍完毕后,就该探索如何在 Kubernetes 中运行应用程序了。 容器包装器 在 Kubernetes 中,我们无法直接创建单个容器。相反,为了更好,我们可以将容器包装成一个单元,其中包括: 规范:多个容器可…...
protobuf序列化解码原理
Protobuf的编码方式 Varints是一种紧凑表示数字的办法。他用一个或者多个字节表示一个数字,值越小的数字节节数越少。相对与传统的用4字节表示int32类型的数字,Varints对于小于128的数值都可以用一个字节表示,大于128的数值会用更多的字节来表…...
OpenCV——line、circle、rectangle、ellipse、polylines函数的使用和绘制文本putText函数以及绘制中文的方法。
学习OpenCV的过程中,画图是不可避免的,本篇文章旨在介绍OpenCV中与画图相关的基础函数。 1、画线条——line()函数 介绍: cv2.line(image, start_point, end_point, color, thickness)参数: image: 图像start_point:…...
性能平台数据提速之路
作者 | 性能中台团队 导读 性能平台负责MEG所有研发数据的管理、接入、传输、应用等各个环节。数据的提速对于公司报表建设、决策分析、转化策略效果都有至关重要的影响。重点介绍数据生产端与消费端提速落地实践,如何高性价比满足大数据生产端提速?如何…...
Dns域名解析服务器
前言 域名解析服务器的介绍 域名服务器的类型划分 DNS域名解析的过程 为什么需要DNS解析域名为IP地址? 通俗理解Dns DNS劫持 DNS污染 Dns面试经验 前言 DNS是一个应用层协议,用来获取域名对应的IP地址 域名解析服务器的介绍 DNS(Dom…...
关于 JavaScript 中的 Promises
在 JavaScript 中,Promise 是一个对象,它表示一个可能还不可用,但会在未来解决的值。Promises 用于处理异步操作,例如发出网络请求或访问数据库,其中结果不是立即可用的。如果你准备好了,我想开始我们的冒险…...
PMP考前冲刺题——错题集
3、 [多选] 采购部门需要向全球不同的供应商采购项目所需的各种商品,所有采购订单均己发送给供应商并已按要求处理。项目经理后来收到客户提出的变更请求。由于项目经理未及时通知采购部门,运抵的所有物品都是按原来的需求所提供。 项目经理本应做什么来…...
【C++】30h速成C++从入门到精通(多态)
多态的概念多态:通俗来说就是多种心态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。多态的定义及实现多态的构成条件多态是在不同继承关系的类对象,去调用同意函数,产生了不同的行为࿰…...
从proc文件系统中获取gateway的IP地址
在linux的命令行下获取当前网络环境的gateway的IP并不是一件难事,常用的命令有ip route或者route -n,其实route -n也是通过读取proc文件系统下的文件来从内核获取路由表的,但ip route是通过netlink来获取的路由表;本文将讨论如何编写程序从proc文件系统中获取路由表,并从路…...
【LeetCode】剑指 Offer(17)
目录 题目:剑指 Offer 34. 二叉树中和为某一值的路径 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 题目:剑指 Offer …...
MySQL索引类型
MySQL 是最流行的关系型数据库管理系统,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。 索…...
你了解HashMap吗?
一、前言:面试过的人都知道,HashMap是Java程序员在面试中最最最经常被问到的一个点,可以说,不了解HashMap都不好意思说自己是做Java开发的。基本上你去面试十家公司,有七八家都会问到你HashMap。那么今天,就…...
我一个女孩子居然做了十年硬件……
2011年,一个三本大学的电子信息专业的大三女学生跟2个通信专业的大二男生组成了一组代表学校参加2011年“瑞萨杯”全国大学生电子设计大赛,很意外的获得了湖北赛区省三等奖,虽然很意外,但还是挺高兴的,毕竟第一次为喜欢…...
【Linux】编译器gcc g++和调试器gdb的使用
文章目录1.编译器gcc/g1.1C语言程序的翻译过程1.预处理2.编译3.汇编4. 链接1.2 链接方式与函数库1.动态链接与静态链接2.动态库与静态库1.3 gcc与g的使用2.调试器gdb2.1debug和release2.2gdb的安装2.3gdb的使用2.4gdb的常用指令3.总结1.编译器gcc/g 1.1C语言程序的翻译过程 1…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
