day3shell脚本

4.7输入read

C语言中的输入
int a;
scanf("%d",&a);
C++中的输入
int a;
cin >> a;shell中的输入:
read  var1   ---->从终端输入var1的值
read -p "提示信息" 变量  ----->在用户输入前输出提示信息
read -s 变量  ---->输入时不会回显
read -t 秒数 变量  ------>如果n秒内不输入就结束读取
read -n 个数 变量  ------>输入n个字符后就结束读取

思考:
read的4个参数能否结合使用?

read -sp "请输入一个变量" -t  4  -n 5 var

4.8命令置换符
作用:把指令的运行结果赋值给变量

法一 ``(反引号常用)  ~不按shift就能打出反引号
法二 $()

练习:
1、输出/etc/passwd中,查找到的sys用户的行号,用变量保存行号,并输出。
var=grep -nw sys /etc/passwd |cut -d : -f 1
echo $var

五数组

shell支持稀疏数组

5.1定义

int arr[]={2,4,7}; 
int arr1[4]={0};      shell中数组
数组名=(初始值1 初始值2 初始值3 ·····)  
#shell中的数组,使用()包含初始化列表
#shell中数组的每个元素的间隔是空格,不是逗号
数组名=([下标]=初始值1 [下标]=初始值2 [下标]=初始值3 ······)

5.2访问数组中的元素

数组中存储多个数据,下标仍然从0开始,还是通过下标访问

${数组名[下标]} ----->获取数组中元素的值
arr[0]=89   ------>给arr数组中下标为0的元素赋值

5.3获取数组中元素的个数

${arr[@]}    ----->获取数组中的所有元素
${arr[*]}    ----->获取数组中的所有元素${#arr[*]}   ----->获取数组中所有元素的个数
${#arr[0]}   ----->下标为0的元素包含的字符的个数
#!/bin/bash
arr=(1 5 7 10)
arr1=([0]=100 [5]=90 [9]=7)
echo ${arr[3]}
echo ${arr1[5]}
#echo ${arr1[3]}   #是一个空值,arr1中没有下标为3的元素
echo ${#arr[*]}
echo ${#arr1[*]}
#echo ${arr[*]}
#echo ${arr[@]}#给arr1这个稀疏数组添加下标为2的元素
arr1[2]=200
echo ${arr1[2]}
#添加元素后检验数组中元素的个数
echo ${#arr1[*]}

思考:

1、shell中是否可以使用已有的数组,给新的数组赋值
2、如果输出echo ${#arr[0]} ---->输出的结果是什么 下标为0的元素有多少个字符

5.4使用已有的数组给新的数组赋值

拿到已有数组的所有元素,给新的数组

arr=(12 90 100)
#使用arr给arr1数组赋值
arr1=(${arr[*]})   ---->数组元素需要加()arr2=(h e l)
arr3=(${arr[*]}${arr2[*]})  ---->100和h是连在一起的元素,arr3中元素的个数5
arr3=(${arr[*]} ${arr2[*]})  ---->100和h是分开的两个元素,arr3中元素的个数6

练习:

1、使用数组求,外部参数的个数,不可以直接使用$#

#!/bin/bash
a=($*)
echo ${#a[*]}

2、使用数组,求家目录下文件的个数,包括隐藏文件

#!/bin/bash 
arr=($(ls ~/ -a))
echo ${#arr[*]}
echo ${arr[*]}

六、shell中的算数运算

shell本身擅长执行指令,不擅长做运算,shell中的运算需要借助于指令
*(()) * $[] let expr

6.1使用(())进行算数运算

shell中支持幂运算  **
格式:((表达式1,表达式2,表达式3,······)),每一个语句都会运行,取最后一个语句的结果
(())常用于整形数据的运算
(())内使用变量的值,可以加$也可以不加$
(())内运算符两侧可以加空格,也可以不加空格
(())支持几乎所有C语言的语法
获取(())的运算结果,$(()),如果想把运算的结果赋值给变量:变量名=$(()),还可以((变量名=表达式))

练习:

1、终端输入3位的变量,输出两个变量相加的结果

#!/bin/bash
read -n 3 var1 
echo ""
read -n 3 var2
echo $((var1 + $var2))

2、计算root用户的uid和ubuntu用户的gid相加的结果

#!/bin/bash
rid=`id -u root`
gid=`id -g ubuntu`
echo $((rid+gid))

6.2使用$[]进行算术运算

格式:变量名=$[表达式1,表达式2,表达式3,······],取最后一个表达式的结果
$[]运算时,变量可以加$也可以不加
运算符两侧可以加空格,也可以不加空格
仍然支持幂运算
#!/bin/bash
rid=`id -u root`
gid=`id -g ubuntu`
ret=$[gid**rid]
echo $ret

6.3使用let进行算数运算

let  变量名=表达式,let运算时变量名一定和let间要有空格
使用变量的值,可以加$可以不加$
运算符两侧不能有空格
let一定要放在指令最前面的位置
#!/bin/bash
rid=`id -u root`
gid=`id -g ubuntu`
ret=$[gid**rid]
echo $retlet ret1=$rid+gid
echo $ret1

练习:

1、终端输入两个变量,分别使用$[]和let计算相加的结果
read -p “请输入一个变量” var1
read -p “请输入一个变量” var2
echo $[var1+var2]
let ret=var1+var2
echo $ret

6.4expr运算 ----->是指令

格式:expr  表达式
使用变量时必须加$
运算符两侧一定要加空格  
expr不支持幂运算,也不支持自增自减运算
expr在使用时,某些字符需要转义:\|,\.,\*·······,判断在字符是否需要转义,可以现在命令行敲出该指令
由于expr是一条指令,指令的结果需要使用命令置换符接收
expr指令会自动回显指令的运行结果到终端
expr支持的更多运算
  ARG1 | ARG2       若ARG1 的值不为0,则返回ARG1,否则返回ARG2ARG1 & ARG2       若两边的值都不为0,则返回ARG1,否则返回 0ARG1 < ARG2       ARG1 小于ARG2        #<需要转义ARG1 <= ARG2      ARG1 小于或等于ARG2ARG1 = ARG2       ARG1 等于ARG2ARG1 != ARG2      ARG1 不等于ARG2ARG1 >= ARG2      ARG1 大于或等于ARG2    #>需要转义ARG1 > ARG2       ARG1 大于ARG2
#!/bin/bash
var1=100
var2=9
expr $var2 \& $var1
expr $var2 \> $var1
expr $var2 \< $var1

expr可以进行的字符串运算

expr match $str1  $str2返回str2在str1中完全匹配到的个数
expr substr STRING POS LENGTH截取子串,从string的第pos位开始,截取长度为length的子串,pos从1开始
expr index STRING CHARS返回字符在string中第一次出现的位置,如果跟了多个字符,返回最先的字符的位置
expr length STRING返回字符串的长度
#!/bin/bash
str1=hello
str2=hei 
expr match  $str1 $str2
expr substr $str1 2 3  #ell
expr index  $str1 lehp  #1,因为h在hello中最先出现
expr length $str1

练习:

1、求家目录下,第二个文件的,文件名长度(使用expr)

#!/bin/bash
arr=(`ls ~`)    #先把家目录下的文件放在数组中
expr length ${arr[1]}#求数组中第二个而元素的长度

2、终端输入一个文件名,截取出文件的后缀(使用expr)

read var1
pos=`expr index $var1 "."`#从pos+1开始截取的原因是:不把.截取出来
expr substr $var1 $((pos+1)) 3

3、终端输入网址:www.hqyj.com,要求截取出网址的每个部分
www
hqyj
com 并且放在数组中

#!/bin/bash
read -p "请输入一个网址" net
pos=`expr index $net '.'`
arr[0]=`expr substr $net 1 $((pos-1))`  #截取到www放入数组中
#求输入网址的长度
len=`expr length $net`
#截取出除www.外的其他部分
str2=`expr substr $net $((pos+1)) $len`#找剩余部分.出现的位置
pos2=`expr index $str2 '.'`#截取出网址里两个.中间的部分
arr[1]=`expr substr $str2 1 $((pos2-1))`#截取出最后剩余的部分
arr[2]=`expr substr $str2 $((pos2+1)) $len`echo ${arr[0]}
echo ${arr[1]}
echo ${arr[2]}

七、shell中的分支结构

7.1if分支

C语言中的if
if(条件1)
{条件1成立执行的代码块;
}
else if(条件2)
{条件1不成立但是条件2成立执行的代码块;
}shell中的if
单分支if
if [ test表达式 ]     -----> if test 表达式
thentest表达式成立执行的语句
fi双分支
if [ test表达式 ]     -----> if test 表达式
thentest表达式成立执行的语句
elsetest表达式不成立执行的语句
fi 多分支if
if [ test表达式 ]     -----> if test 表达式
thentest表达式成立执行的语句
elif [ test表达式 ]
thentest表达式不成立执行的语句
fi 

[]和[[]]的区别

[]是所有解析器都通用的test指令
[[]]只支持部分shell解析器
[[]]]内可以正确识别字符串的范围
[]test本身,不能正确识别字符串的范围,需要给字符串加""
[[]]内可以i使用&&和||,但是[]只能使用test的参数

7.2test指令的使用

i)对于整数的操作

-eq:相等
-ge:大于等于
-gt:大于
-le:小于等于
-lt:小于
-ne:不等于
#!/bin/bash
var1=100
var2=100if [ $var1 -gt $var2 ]
then   #then表示if语句的开始echo "var1>var2"
elif [ $var1 -eq $var2 ]
thenecho "var1==var2"
elseecho "var1<var2"
fi   #fi表示if语句的结束

练习:

1、终端输入年份,判断闰平年,四年一闰,百年不闰,四百年再闰

#!/bin/bash
read -p "请输入年份" year#if [ $((year%4)) -eq 0 ] && [ $((year%100)) -ne 0 ] || [ $((year%400)) -eq 0 ]
#if [[ $((year%4)) -eq 0 && $((year%100)) -ne 0 || $((year%400)) -eq 0 ]]
if [ $((year%4)) -eq 0 -a $((year%100)) -ne 0 -o $((year%400)) -eq 0 ]
thenecho "${year}是闰年"
elseecho "${year}是平年"
fi

ii)test指令中的逻辑与和逻辑或

-a:和C中的逻辑与相同
-o:和C中的逻辑或相同

iii)test对于字符串的判断

-n STRING:判断字符串非空
-z STRING:判断字符串为空
STRING1 = STRING2:判断两个字符串相等
STRING1 != STRING2:判断两个字符串不相等

iv)test对文件的判断

FILE1 -nt FILE2:f1的时间戳比f2的更新
FILE1 -ot FILE2:f1的时间戳比f2的更旧
-e FILE:判断文件是否存在
-f FILE:文件存在是一个普通文件
-s FILE:文件存在且有内容
-S FILE:文件存在且为套接字文件
-L/-h FILE:文件存在且为软链接文件
-p FILE:文件存在且为管道文件
-b FILE:文件存在且为块设备文件
-c FILE:文件存在且为字符设备文件
-r FILE:文件存在有可读权限
-w FILE:文件存在有可写权限
-x FILE:文件存在有可执行权限

判断家目录下,普通文件的个数和目录文件的个数

#!/bin/bash 
var=(`ls -la ~/`)
var1=(`ls -la ~/ | cut -d r -f 1 | grep -i d`)
var2=(`ls -la ~/ | cut -d r -f 1 | grep -i -`)
echo ${#var[*]}
echo ${#var1[*]}
echo ${#var2[*]}

输入一个文件名,判断是否为shell脚本文件,如果是脚本文件,判断是否有可执行权限,如果有可执行权限,运行文件,如果没有可执行权限,给文件添加可执行权限。

#!/bin/bash
read -p 请输入一个文件名 filename 
length=`expr length ${filename}`
fileType=`expr substr ${filename} $((length-2)) 3`
echo ${length}
echo ${fileType}
authority=`getfacl ${filename}`
echo ${authority}
userAuth=`cut -d " " -f 10 ${authority}`
echo ${userAuth}
if [ $fileType == ".sh" ]
then echo "是shell脚本"#`bash ${filename}`
elseecho "不是shell脚本"
fi

终端输入两文件名,判断哪一个文件更新

#!/bin/bash
read -p 请输入文件名1 file1
read -p 请输入文件名2 file2
if [ file1 -nt file2 ]
thenecho "${file1}  newer than ${file2}"
elseecho "${file1} older than ${file2}"
fi

写一个shell脚本,获取当前用户名,用户id和工作路径

#!/bin/bash
whoami
echo `whoami | id -u`
echo `pwd`

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

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

相关文章

Flutter 文件上传(七牛云)简单封装

前言&#xff1a;记录了七牛云上传图片的简单封装、若有不足 欢迎指正。 开始前准备&#xff1a; A、七牛sdk版本一定要和dart版本相对应&#xff08;推荐用any方式、让其自己去匹配&#xff09;&#xff1b; qiniu_flutter_sdk: any B、七牛上传文件所需的参数&#xff1a; …

GPIO实验

一、GPIO GPIO&#xff08;General-purpose input/output&#xff09;即通用型输入输出&#xff0c;GPIO可以控制连接在其之上的引脚实现信号的输入和输出 芯片的引脚与外部设备相连&#xff0c;从而实现与外部硬件设备的通讯、控制及信号采集等功能 LED实验步骤 最终目的&am…

优质的论文讲解

优质的论文讲解 2023 ICML UPop: Unified and Progressive Pruning for Compressing Vision-Language Transformers

windows 同时安装 Mysql 5.7 和8.0

下载链接 https://dev.mysql.com/downloads/mysql/ 推荐下载 MSI&#xff0c;可以通过图像化界面配置 8.1 版本 安装5.7 系统安装两个MySQL 怎么访问 都是mysql&#xff0c;所以环境变量 配置&#xff0c;只能一个生效&#xff0c;生效就是谁靠前谁生效 cmd 录入 services.m…

Linux用户管理

一、linux用户&#xff1a;username/UID Linux用户分为以下几种 root用户&#xff1a;UID为0&#xff0c;也称超级用户&#xff0c;权限最高。系统用户&#xff1a;UID为1~999&#xff0c;也称虚拟用户、伪用户、假用户&#xff0c;是系统自身拥有的用户&#xff0c;比如bin、…

SpringBoot+SSM实战<一>:打造高效便捷的企业级Java外卖订购系统

文章目录 项目简介项目架构功能模块管理端用户端 技术选型用户层网关层应用层数据层工具 项目优缺点结语 黑马程序员最新Java项目实战《苍穹外卖》&#xff1a;让你轻松掌握SpringBootSSM的企业级开发技巧项目简介 《苍穹外卖》是一款为餐饮企业&#xff08;餐厅、饭店&#x…

C++ 类的继承与派生

1.继承关系举例 交通工具的分类如下图所示&#xff1a; 这个分类树反映了交通工具的派生关系&#xff0c;最高层是抽象程度最高的&#xff0c;是最具有普遍和一般意义的概念&#xff0c;下层具有了上层的特性&#xff0c;同时加入了自己的新特征&#xff0c;而最下层是最为具…

C#设计模式之抽象工厂

抽象工厂模式是一种创建型设计模式&#xff0c;用于提供一个统一的接口来创建相关或依赖对象的系列&#xff0c;而无需指定具体的类。当需要满足以下情况之一时&#xff0c;可以考虑使用抽象工厂模式&#xff1a;创建一组相关的产品&#xff1a;抽象工厂模式适用于创建一系列相…

30岁程序员第一次失败的餐饮创业经历

背景介绍 我什么都比较晚&#xff0c;我比大多数人晚了两年毕业&#xff0c;事业稳定也比别人晚。直到去年&#xff0c;我才跳槽到一家外企外包工作获得相对满意的薪资。但即使如此&#xff0c;与更有经验的人相比&#xff0c;我仍然有很大的差距&#xff0c;自己也尚未积累足…

[CKA]考试之PersistentVolumeClaims

由于最新的CKA考试改版&#xff0c;不允许存储书签&#xff0c;本博客致力怎么一步步从官网把答案找到&#xff0c;如何修改把题做对&#xff0c;下面开始我们的 CKA之旅 题目为&#xff1a; Task 创建一个名字为pv-volume的pvc&#xff0c;指定storageClass为csi-hostpath-…

HTML中元素和标签有什么区别?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 标签&#xff08;Tag&#xff09;⭐元素&#xff08;Element&#xff09;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&a…

Leetcode-每日一题【剑指 Offer 17. 打印从1到最大的n位数】

题目 输入数字 n&#xff0c;按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3&#xff0c;则打印出 1、2、3 一直到最大的 3 位数 999。 示例 1: 输入: n 1输出: [1,2,3,4,5,6,7,8,9] 说明&#xff1a; 用返回一个整数列表来代替打印 n 为正整数 解题思路 前置知识 M…

嵌入式面试八股文

一、C/C题目 1.1.strcat、strncat、strcmp、strcpy&#xff0c;那些会导致内存溢出&#xff1f;如何改进&#xff1f; strcmp&#xff1a;与内存溢出没有关系&#xff0c;其功能为比较两个字符串是否相等。strcpy&#xff1a;把源字符串拷贝到目的内存中&#xff0c;如果源字符…

kubernetes基于helm部署gitlab

kubernetes基于helm部署gitlab 这篇博文介绍如何在 Kubernetes 中使用helm部署 GitLab。 先决条件 已运行的 Kubernetes 集群负载均衡器&#xff0c;为ingress-nginx控制器提供EXTERNAL-IP&#xff0c;本示例使用metallb默认存储类&#xff0c;为gitlab pods提供持久化存储&…

将word每页页眉单独设置

在进行论文排版的时候&#xff0c;总是会出现页眉的页码设置问题&#xff0c;比如出现奇数或偶数页码一致&#xff0c;尝试将前面页码改掉&#xff0c;后面再修改前面也进行了变动&#xff0c;将每页页眉单独设置&#xff1a; &#xff08;1&#xff09;在第一页的最后一行输入…

OPENCV C++(四)形态学操作+连通域统计

形态学操作 先得到一个卷积核 Mat kernel getStructuringElement(MORPH_RECT,Size(5,5)); 第一个是形状 第二个是卷积核大小 依次为腐蚀 膨胀 开运算 闭运算 Mat erodemat,dilatemat,openmat,closemat;morphologyEx(result1, erodemat, MORPH_ERODE, kernel);morphologyEx…

智能指针shared_ptr:自定义删除器

重点&#xff1a; 1.普通指针转化成智能指针。 2.智能指针创建的时候&#xff0c;第二个参数是自定义删除器&#xff0c;默认情况下&#xff0c;shared_ptr调用delete()函数。 class A { public:void Get() { cout << b << endl; }; private:int b{ 10 }; };clas…

Pandas

系列文章目录 第一章 python数据挖掘基础环境安装和使用 第二章 Matplotlib 第三章 Numpy 文章目录 系列文章目录一、介绍1.1 为什么用Pandas&#xff1f;1.2 核心数据结构1.3 DataFrame1.3.1 结构1.3.2 常用属性1.3.3 常用方法1.3.4 DataFrame索引的设置修改行列索引值重设索…

git仓库与本地暂存区的同步问题

向下同步 对于远程仓库的项目&#xff0c;初始化一个配置文件&#xff0c;配置远程仓库及相关信息&#xff0c;赋值远程仓库的地址&#xff0c;使用git pull命令即可拉取仓库代码。 git pull [remote_addr] 该部分完成向下同步 向上同步 向上同步时会遇到很多的问题&#xf…

utf8mb4_general_ci 和utf8mb4_unicode_ci有什么异同,有什么优劣

utf8mb4_general_ci 和 utf8mb4_unicode_ci 都是 MySQL 数据库中的字符集和排序规则&#xff08;collation&#xff09;。它们主要用于指定字符数据的排序和比较规则&#xff0c;以确保在数据库中对字符串进行查询和比较时得到正确的结果。 异同点&#xff1a; 1. utf8mb4_gen…