day51


shell脚本


修改环境变量


1) 查看已有的特殊系统变量


系统配置好的,内置的环境
 

env 或者 printenv


2) 查看环境变量
 

echo $HOME
环境变量的作用:
当在终端直接运行指令时,会默认去环境变量保存的路径中查找指令,如果没找到该指令不能执行
3) 修改环境变量
i) 只对当前终端有效
 

新建环境变量: export HELLO="Hello!"
 
export PATH=${PATH}:/home/ubuntu
上面代码框中的效果:在当前终端给PATH添加了一个/home/ubuntu路径

ii) 只对当前用户生效
 

修改用户家目录下的 ~/.bashrc文件
由于是自己用户的家目录,所以不需要加sudo
vim ~/.bashrc

如没有以上内容,下面这个也是可以的

修改后重新打开一个终端即可生效

iii) 对所有的用户生效
 

修改 /etc/bash.bashrc 文件
sudo vim /etc/bash.bashrc
使用 export 表达式添加
iv) 对所有的用户生效
 

修改 /etc/environment 文件
sudo vim /etc/environment
只有一行PATH的信息,将想要添加的路径,以:为分隔加到原有路径后面即可
 


shell中的变量


shell变量没有数据类型的区别,shell是一种弱数据类型语言,shell中都当做字符串处理


1) shell中的格式
 

变量名=变量的值
变量名='变量的值'        --->  用于变量的值中间有空格
变量名="变量的值"        --->  用于使用已有变量的值和空格拼接给新变量赋值时(只要需要用已有变量的值都建议加"")
HELLO=hello
WORLD="$HELLO world"
=两侧不能有空格
''内不能使用$展开变量的值


2) 如何访问变量
 

$变量名    --->  获取变量的值
${变量名}  --->  获取变量的值,为了更好区分变量名的范围

3) 修饰变量的关键字
 

readonly :只读变量,只不能更改
unset :清空变量的值,不能清空readonly修饰变量的值
local :定义局部变量,只能在函数中使用

4) 外部传参/位置变量


和C语言相同,脚本也可以在执行时进行外部传参,shell中通过位置变量获取参数
 

$0    ---> 执行的脚本名
$1-$9
 
$n         --->  n >= 10,必须加上{}
${10}-${n}  
 
$#    --->  获取所有外部参数的个数(不包括脚本名)
$* 或者 $@    --->  获取所有的外部参数(不包含脚本名)

echo 输出内容(将内容回显到终端,并自动换行)
echo默认不解析转义字符
echo -n 输出内容  ------>取消echo输出时的换行
echo -e "hello\n"   ------->解析转义字符


5) 输入


shell中read指令完成输入
 

read 变量名    --->  直接加变量名即可
read -p "提示信息" 变量名    --->  在终端给用户输入提示信息
read -s 变量名    ---> 输入的信息不回显
read -t 秒数 变量名    --->  如果用户n秒不输入,就结束输入并向后执行语句
read -n 个数 变量名    --->  如果输入n个字符,输入自动停止
 
 

#!/bin/bash  
 
#read VAL1
#read -p "请输入三个数字,以空格隔开" A B C
# read -s A
# read -t 3 STR
read -n 5 STR
echo $STR 
# echo $VAL1 
# echo $A 
# echo $B 
# echo $C 
 


6) 命令置换符


作用:获取该指令的执行结果
将一个命令的输出作为另一个命令的参数。
 

1. `指令`  (反引号)
2. $(指令)


 

shell中的运算


shell本省不擅长运算,需要借助运算符和其他指令
(())    $[]    let    expr
1) (())
常用于shell中的整数算术运算
使用方法:
1.
(())几乎支持所有的C语言语法,还支持shell中幂运算**
2.
((表达式1, 表达式2, 表达式2, ...)) 每个表达式都会执行,获取最右侧一个表达式的结果
3.
想要获取运算结果,需要使用 $(()),还可以((变量名=表达式))
4.
在(())中,使用变量,可以加$,也可以不加
5.
在(())中,运算符两侧可以有空格

#!/bin/bash
read -p "请输入一个三位数" -n 3 num1
read -p "请输入一个三位数" -n 3 num2
 
echo $((num1+num2))
echo $((num1-num2))
echo $((num1*num2))
echo $((num1%num2))
2、比较root用户和当前用户uid的大小关系,输出较大的一个
 

#!/bin/bash
id_u=`id -u`
id_r=`id -u root`
 
echo $((id_u > id_r ? id_u : id_r))
2) $[]
使用方法:
1.
变量名=$[表达式1,表达式2,表达式3,·······]只获取最右侧表达式的结果
2.
使用变量时,可以加$也可以不加$
3.
运算符两侧可以加空格,也可以不加空格
4.
仍然支持幂运算
5.
$[]的结果,建议直接按照"变量名=$[]"格式接收,因为$[]本质上,会遗留一个运算结果在表达式的位置,如果不接受继续向后运行指令会报错
 

#!/bin/bash
num1=10 
num2=20 
 
echo $[num1+num2] 
 
num3=$[num1 + num2] 
echo $num3
3) expr
expr是一个终端指令
使用方法:
1.
expr 中使用变量,必须加$
2.
如果想要接收expr的结果,必须使用命令置换符
3.
expr中运算符两侧必须有空格,不支持自增、自减和shell中幂运算
4.
expr中使用某些运算符是,需要转义|、>、<、.、+、()、……(不需要记转义字符,简单的指令在运行前,去终端里运行一下指令)
5.
expr指令的结果,可以直接回显到终端上,可以使用命令置换符接收
6.
expr操作数值不能为空
expr进行算数运算
 

  ARG1 | ARG2       若ARG1 的值不为0,返回ARG1,否则返回ARG2
  ARG1 & ARG2       若两边的值都不为0,则返回ARG1,否则返回 0 
 
  ARG1 < ARG2       ARG1 小于ARG2
  ARG1 <= ARG2      ARG1 小于或等于ARG2
  ARG1 = ARG2       ARG1 等于ARG2
  ARG1 != ARG2      ARG1 不等于ARG2
  ARG1 >= ARG2      ARG1 大于或等于ARG2
  ARG1 > ARG2       ARG1 大于ARG2
 
  ARG1 + ARG2       计算 ARG1 与ARG2 相加之和
  ARG1 - ARG2       计算 ARG1 与ARG2 相减之差
  ARG1 * ARG2       计算 ARG1 与ARG2 相乘之积
  ARG1 / ARG2       计算 ARG1 与ARG2 相除之商
  ARG1 % ARG2       计算 ARG1 与ARG2 相除之余数
 

如果expr的操作数为空,会报语法错误

#!/bin/bash 
expr $1 \> $2
2、计算/etc/passwd中,第20行uid和gid之和
 

#!/bin/bash
uid=`head -20 /etc/passwd|tail -1|cut -d : -f 3`
gid=`head -20 /etc/passwd|tail -1|cut -d : -f 4`
expr $uid + $gid
expr可以进行字符串的运算
 

match 字符串 表达式
    返回表达式,在字符串中第一个位置起完全匹配成功的字符个数,如果能匹配成功,返回值就是表达式中字符的个数
substr 字符串 偏移量 长度
    从字符串中偏移量的位置开始,截取指定长度的字符串,偏移量从1开始
index 字符串 字符
    返回字符在字符串中第一次被查找到时得下标,下标从1开始
length 字符串
    字符串的长度
 

str1="hello world" 
str2="wor" 
expr match "$str1" $str2    # str2不能在str1中的第一个位置开始完全匹配返回0 
expr match "$str1" "hello"  # 从第一位起匹配到的个数为5  
expr substr "$str1" 1 3     # hel 
expr substr "$str1" 7 5     # world 
expr index "$str1" l        # 3 
expr index "$str1" le       # 2 如果查找多个字符在字符串中的位置,返回最先出现的字符的位置 
expr length "$str1"
4) let
使用方法:
1.
let运算时,运算符两侧一定不能有空格
2.
let 变量名=表达式  ---> let和变量名中一定要有空格
3.
let运算时,可以加$,也可以不加
4.
如果直接写成 let 表达式,表达式会运行,但是没有办法接收

#!/bin/bash
count_c=`ls ~/*c | wc -l`
count_sh=`ls ~/*sh | wc -l`
let count=count_c+count_sh
echo $count
6. shell中的数组
1) 定义
 

int arr[32];
int arr[] = {};
int arr[3] = {1, 2, 3};
 
shell中的数组
数组名=(val1 val2 val3 ...)
# shell中的数组,不需要写出数组长度
# shell中的数组初始化时,直接使用()
# shell中的数组每个元素之间是空格,不是逗号
# 访问仍然需要通过下标,下标从0开始
 
采用键值对的方式赋值
数组名=([下标值]=val1 [下标值]=val2 ...)
arr=([9]=1 [0]=4 ...)
下标可以不连续
 
采用列表名的方式赋值
列表名="val1 val2 val3 ..."
数组名=($列表名)
 
通过分别定义数组变量的方式赋值
数组名[0]="val1"
数组名[1]="val2"
2) 访问数组中的元素
 

只要在shell中需要使用变量的值,都需要用 $ 进行访问
${数组名[下标]}    --->  获取数组中指定下标的元素值

3) 获取数组中所有元素
 

${数组名[*]}    --->  获取数组中的所有元素
${数组名[@]}    --->  获取数组中的所有元素
 
获取数组中元素的个数
${#数组名[*]}    ---> 获取数组中元素的个数
${#数组名[下标]}    ---> 获取数组中指定下标元素的长度(字符个数)
 
对数组元素重新赋值
数组名[下标]=新值
 

#!/bin/bash
arr=(`ls ~`)
echo "家目录下文件的个数: ${#arr[*]}"
arr1=($*)
echo "所有的外部参数的个数: ${#arr[*]}"
4) 稀疏数组
下标不连续的数组
稀疏数组中元素的个数,由不为空的数据的个数决定
 

arr[0]=10 
arr[3]=30 
arr[8]=80 
echo ${arr[*]} 
echo ${#arr[*]} # 3 
echo "添加数据前" 
arr1=([2]=20 [4]=40 [0]=hello) 
echo ${arr1[*]} 
echo ${#arr1[*]} # 3 
echo "添加数据后" 
arr1[3]=world
echo ${arr1[*]} 
echo ${#arr1[*]} # 4

5) 使用已有的数组给新的数组赋值
 

arr=(1 2 3 4 5) 
arr1=(a b c d) 
 
arr2=(${arr[*]} ${arr1[*]}) # 拼接加空格   
echo ${arr2[*]} 
echo ${#arr2[*]} # 9
拼接时两个数组中间没有加空格,第一个数组中的最后一个元素和第二个数组中的第一个元素会拼接在一起

拼接时两个数组中间加空格,两个数组独立起来拼接

6) 数组切片
 

取数组中的某一段的元素的值
格式:
${数组名[@ 或*]:起始位置(起始下标):长度}

#!/bin/bash# a. 在家目录下创建目录文件,dir
mkdir ~/dir# b. dir下创建dir1和dir2
mkdir ~/dir/dir1
mkdir ~/dir/dir2# c. 把当前目录下的所有文件拷贝到dir1中
cp * ~/dir/dir1# d. 把当前目录下的所有脚本文件拷贝到dir2中
find . -type f -name "*.sh" -exec cp {} ~/dir/dir2 \;# e. 把dir2打包并压缩为dir2.tar.xz
tar -cJf ~/dir/dir2.tar.xz -C ~/dir dir2# f. 再把dir2.tar.xz移动到dir1中
mv ~/dir/dir2.tar.xz ~/dir/dir1# g. 解压dir1中的压缩包
cd ~/dir/dir1
tar -xJf dir2.tar.xz
#!/bin/bash# a. 显示/etc/group文件中第五行的内容
sed -n '5p' /etc/group# b. 创建目录/home/ubuntu/copy
mkdir /home/ubuntu/copy# c. 切换工作路径到此目录
cd /home/ubuntu/copy# d. 复制/etc/shadow到此目录,并重命名为test
cp /etc/shadow ./ test# e. 将当前目录中test的所属用户改为root
sudo chown root test# f. 将test中其他用户的权限改为没有任何权限
chmod o-rwx test

#!/bin/bashurl="www.hqyj.com"# 使用 expr 和 sed 提取
protocol=$(expr "$url" : '\([^.]*\)')
domain=$(expr "$url" : '[^.]*\.\([^\.]*\)')
tld=$(expr "$url" : '[^.]*\.[^.]*\.\(.*\)')echo "$protocol"
echo "$domain"
echo "$tld"

read -p "请输入数组" -a arr
echo ${arr[*]}
echo ${#arr[*]}
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/428016.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Zookeeper安装使用教程

# 安装 官网下载安装包 #配置文件 端口默认8080&#xff0c;可能需要更改一下 #启动 cd /Users/lisongsong/software/apache-zookeeper-3.7.2-bin/bin ./zkServer.sh start #查看运行状态 ./zkServer.sh status #停止 ./zkServer.sh stop #启动客户端 ./zkCli.sh ls /

【高分系列卫星简介】

高分系列卫星是中国国家高分辨率对地观测系统&#xff08;简称“高分工程”&#xff09;的重要组成部分&#xff0c;旨在提供全球范围内的高分辨率遥感数据&#xff0c;广泛应用于环境监测、灾害应急、城市规划、农业估产等多个领域。以下是对高分系列卫星及其数据、相关参数和…

英语六级-学习

01 英语分值比例 02听力学习 听力练习&#xff0c;基础好选择标准VOA和BBC。基础差选择VOA慢速。 听力内容包括不受政治争议的内容&#xff0c;社会生活类(奇闻趣事、日常生活)、经济类(商务、职场相关)、环保类、互联网类---------根据各类主题快速找到录音材料中心点。 研…

搭建本地DVWA靶场教程 及 靶场使用示例

1. DVWA简介 DVWA&#xff08;Damn Vulnerable Web Application&#xff09;一个用来进行安全脆弱性鉴定的PHP/MySQL Web 应用平台&#xff0c;旨在为网络安全专业人员测试自己的专业技能和工具提供合法的环境&#xff0c;帮助web开发者更好的理解web应用安全防范的过程。 DVW…

数据结构之二叉树(1)

数据结构之二叉树&#xff08;1&#xff09; 一、树 1、树的概念与结构 &#xff08;1&#xff09;树是一种非线性的数据结构&#xff0c;由n(n>0)个有限结点组成一个具有层次关系的集合。 &#xff08;2&#xff09;树有一个特殊的结点&#xff0c;叫做根结点&#xff…

村落检测系统源码分享

村落检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

Linux 查看磁盘 df -h 已经查看目录大小 du -sh ./*

使用df -h 命令可以查看磁盘信息 df -h 如下图所示: 获取当前目录 每个目录大小 du -sh ./* du -sh ./* 如果文件比较多 我们想获取文件大小最大的前10个 可以运行如下命令: du -ah | sort -rh | head -n 10 du -ah&#xff1a;显示当前目录及其子目录的所有文件和目录的…

条件编译代码记录

#include <iostream>// 基类模板 template<typename T> class Base { public:void func() {std::cout << "Base function" << std::endl;} };// 特化的子类 template<typename T> class Derived : public Base<T> { public:void…

【混淆矩阵】Confusion Matrix!定量评价的基础!如何计算全面、准确的定量指标去衡量模型分类的好坏??

【混淆矩阵】Confusion Matrix&#xff01;定量评价的基础&#xff01; 如何计算全面、准确的定量指标去衡量模型分类的好坏&#xff1f;&#xff1f; 文章目录 【混淆矩阵】Confusion Matrix&#xff01;定量评价的基础&#xff01;1. 混淆矩阵2.评价指标3.混淆矩阵及评价指标…

Mysql InnoDB 存储引擎简介

InnoDB 存储引擎是 Mysql 的默认存储引擎&#xff0c;它是由 Innobase Oy 公司开发的 Mysql 为什么默认使用 InnoDB 存储引擎 InnoDB 是一款兼顾高可靠性和高性能的通用存储引擎 在 Mysql 5.5 版本之前&#xff0c;默认是使用 MyISAM 存储引擎&#xff0c;在 5.5 及其之后版…

【红动中国-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

Java原生HttpURLConnection实现Get、Post、Put和Delete请求完整工具类分享

这里博主纯手写了一个完整的 HTTP 请求工具类&#xff0c;该工具类支持多种请求方法&#xff0c;包括 GET、POST、PUT 和 DELETE&#xff0c;并且可以选择性地使用身份验证 token。亲测可用&#xff0c;大家可以直接复制并使用这段代码&#xff0c;以便在自己的项目中快速实现 …

powerbi -L10-文件夹内的文件名

powerbi -L10-文件夹内的文件名 Folder.Contents letSource Folder.Contents("\\your_folder\ your_folder "),#"Removed Other Columns" Table.SelectColumns(Source,{"Name", "Date modified", "Folder Path"}), in#&q…

云原生信息安全:筑牢数字化时代的安全防线

云原生信息安全&#xff1a;筑牢数字化时代的安全防线 一、云原生信息安全概述 云原生安全包含两层重要含义。一方面&#xff0c;面向云原生环境的安全&#xff0c;目标是防护云原生环境中的基础设施、编排系统和微服务等系统的安全。在云原生内部&#xff0c;安全机制多以云原…

7个提升网站分页体验的 CSS 和 JavaScript 代码片段

文章目录 前言正文1.简洁直观的悬停分页效果2.实时显示页码的分页3.适合响应式设计的多功能分页4.专为移动设备优化的分页5.无数字的极简分页设计6.触屏友好的分页7.结合无限滚动与分页的设计 总结 前言 分页是内容丰富的网站中不可缺少的导航工具&#xff0c;能帮助用户更轻松…

【数据结构】什么是二叉搜索(排序)树?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;二叉搜索(排序)树的概念 &#x1f4cc;二叉搜索(排序)树的操作 &#x1f38f;二叉搜索树的查找 &#x1f38f;二叉搜索树的插入 &#x1f38f;二叉搜索树的…

how can I train a OpenAI fine tuned model with more prompts

题意&#xff1a;我如何使用更多提示来训练一个 OpenAI 微调模型&#xff1f; 问题背景&#xff1a; I fine-tuned OpenAI model with some prompts following this documentation it succeeded and created a new model in the playground. How I can retrain (fine-tune) th…

邮件营销:助力企业转换客户,提升曝光率

邮件营销&#xff1a;独立站推广的关键策略 在独立站推广的众多方法中&#xff0c;邮件营销占据着重要地位。本文将为刚刚接触独立站运营的新手介绍邮件营销的基础知识。在信息泛滥的时代&#xff0c;开设一个店铺和成功地引流并不意味着一劳永逸。对于绝大多数中小型电商企业…

AIGC实战之如何构建出更好的大模型RAG系统

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

感知器神经网络

1、原理 感知器是一种前馈人工神经网络&#xff0c;是人工神经网络中的一种典型结构。感知器具有分层结构&#xff0c;信息从输入层进入网络&#xff0c;逐层向前传递至输出层。根据感知器神经元变换函数、隐层数以及权值调整规则的不同&#xff0c;可以形成具有各种功能特点的…