当前位置: 首页 > news >正文

Shell脚本的基本例子

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

大数据系列文章目录

目录

    • 定义变量,输出变量
    • 输盘输入,执行Lunix命令
    • 变量禁止修改
    • 变量删除
    • 获取传递的变量
    • 字符串拼接,转义
    • 获取字符串长度
    • 截取字符串
    • 查询字符串
    • 算术运算
    • 流程控制if
    • 流程控制if-else
    • 流程控制if-test
    • 流程控制if-elif-else
    • for循环
    • while循环
    • case
    • break
    • continue
    • function
    • array
    • select
    • select 和 case
    • 引用其他.sh文件
    • 综合小案例
      • 猜数字
      • 创建文件,并且拷贝到指定位置
      • 统计/var/log中的文件个数,并打印文件名
      • 用户输入3个数,并按从小到大依次输出

定义变量,输出变量

#!/bin/bash
string='I am shell'
num=5
echo "a=${num},string=${string}"

输盘输入,执行Lunix命令

#!/bin/bash
echo 'who are you?'
read name #从键盘获取变量的值
pwd_string=$(pwd) #将当前绝对路径赋值给pwd_string变量
date_string=`date` #将当前时间赋值给date_string变量注意这里使用的是反引号
echo "hello,${name}"
echo $pwd_string
echo $date_string

变量禁止修改

#!/bin/bash
myUrl='http://www.google.com'
readonly myUrl
myUrl='http://www.google.com'

变量删除

#!/bin/bash
myUrl='http://www.google.com'
unset myUrl
echo "${myUrl}"

获取传递的变量

#!/bin/bash
echo "Shell 传递参数实例!";
echo "当前文件的名称:$0";
echo "第一个参数:$1";
echo "第二个参数:$2";
echo "第三个参数:$3";
echo "参数的个数:$#";
echo "传递的参数作为一个字符串显示*:$*";

字符串拼接,转义

#!/bin/bash
yourname="吴恩达"
wenhou_1="你好,$yourname."
wenhou_2="你好,"$yourname"."
wenhou_3="你好,\"$yourname\"."
echo $wenhou_1 $wenhou_2 $wenhou_3

获取字符串长度

#!/bin/bash
str="jobs"
echo "${str}"
echo "${#str}"
~              

截取字符串

#!/bin/bash
str="敢于亮剑绝不后退"
echo "${str:0:2}" #第一位数字是从几位开始,第二位数字是截取几位

查询字符串

#!/bin/bash
str="i am a boy"
echo `expr index "$str" io`

算术运算

#!/bin/bash
a=4
b=20
#加法运算
echo `expr $a + $b`
#减法运算
echo `expr $a - $b`
#乘法运算,注意*号前面需要反斜杠
echo `expr $a \* $b`
#除法运算
echo `expr $a / $b`
#此外,还可以通过$(())、$[]进行算术运算
echo "a = $a"
c=$((a+b))
d=$[a+b]
echo "c = $c"
echo "d = $d"

流程控制if

#!/bin/bash
if [ $(ps -ef | grep -c "ssh") -gt 1 ] #grep -c 用于统计字符串出现的次数
thenecho "true"
fi
#!/bin/bash
DIR="/media/cdrom"
if [ ! -e $DIR ]
thenecho "不存在${DIR}这个文件"mkdir -p $DIR
fi

流程控制if-else

#!/bin/bash
read -p "Enter you age(1-100) : " age
if [ $age -ge 18 ]
thenecho '已经成年!'
elseecho '未成年!'
fi

流程控制if-test

#!/bin/bash
echo "计算2个数是否相等!"
read -p '请输入第一个数:' num1
read -p '请输入第二个数:' num2
if [[ ! "$num1" =~ ^[0-9]+$ ]] || [[ ! "$num2" =~ ^[0-9]+$ ]]
thenecho '请输入数字!!'exit
fiif test $num1 -eq $num2
thenecho '2个数相等'
elseecho '2个数不相等'
fi

流程控制if-elif-else

#!/bin/bash
echo '请输入a的值'
read a
echo '请输入b的值'
read bif [ $a == $b ]
thenecho '2个数相等'
elif [ $a -gt $b ]
thenecho 'a大于b'
elif [ $a -lt $b  ]
thenecho 'b大于a'
elseecho '没有符合的条件'
fi
#!/bin/bash
echo '判断成绩优、良、中、差'
read -p 'Enter you score(0-100):' n #-p表示给出提示信息
if [ $n -ge 85  ] && [ $n -le 100  ];thenecho '优'
elif [ $n -ge 70  ] && [ $n -le 84  ];thenecho '良'
elif [ $n -ge 60  ] && [ $n -le 83  ];thenecho '中'
elseecho '差'
fi

for循环

#!/bin/bashecho '--------------------------------第一个for循环-------------------------------'for loop in 1 2 3 4 5
doecho "$loop"
doneecho '--------------------------------第二个for循环--------------------------------'for str in 'This is a string'
doecho "$str"
doneecho '--------------------------------第三个for循环--------------------------------'for file in $(ls /root)
doecho $file
doneecho '--------------------------------第四个for循环--------------------------------'for(( i = 1; i <=10; i++ ))
doecho $i
doneecho '--------------------------------第五个for循环--------------------------------'
echo '计算从1加到100的累加值'
s=0
for((i = 1; i<=100; i++))
do
s=$(($s + $i))
done
echo "从1加到100的和为:$s"

while循环

#!/bin/bashecho '---------------------------------------第一个while循环----------------------------------'num=1
while (( $num <= 5 )) 
do
echo $num
let num++
doneecho '--------------------------------------第二个while循环----------------------------------'sum=0
i=1
while  [ $i -le 100 ]
dolet sum=sum+$ilet i++
done
echo "从1加到100之后的值为:$sum"echo '--------------------------------------第三个while循环----------------------------------'#while :
#do
#echo '我是无限循环'
#done#while true
#do
#echo '我是无限循环'
#donefor((;;))
do
echo '我是无限循环'
done

case

#!/bin/bash
echo '请输入 1 到 4 之前的数字'
read num
case $num in1) echo '你选择了1';;2) echo '你选择了2';;3) echo '你选择了3';;4) echo '你选择了4';;*) echo '你没有输入1到4之间的数字';;
esac

break

#!/bin/bashecho '输入1 到 5之间的数字,否则游戏结束'
while :
doecho -n "请输入 1 到 5 之间的数字:"read numcase $num in1|2|3|4|5) echo "你输入的数字为:$num";;*) echo '你输入的数字不是1到5之间的game over'break;;esac
done

continue

#!/bin/bashwhile :
do
echo -n '请输入1 到 5之间的数字:'
read num
case $num in1|2|3|4|5) echo "你输入的数字为:$num";;*) echo "你输入的数字不是1到5之间的GameOver"continueecho '游戏结束';;
esac
done

function

#!/bin/bashecho '---------------------------------这是第一个函数---------------------------'
function demoFun(){echo '这是一个函数'
}echo '函数开始执行-------'
demoFun
echo '函数结束执行-------'echo '--------------------------------这是第二个函数----------------------------'function funWithReturn(){echo '这里的函数会对2个数进行相加运算'echo '输入第一个数字'read num1echo '输入第二个数字'read num2echo "两个数字分别为:$num1$num2"echo "两个数的和为:$((num1 + num2))"return $(($num1 + $num2))
}funWithReturnecho "退出状态码:$?!"echo '--------------------------------这是第三个函数-----------------------------'funWithParam(){echo "第一个参数为:$1 "echo "第二个参数为:$2 "echo "第十个参数为:$10 "echo "第十个参数为:${10}"echo "第十一个参数为:${11}"echo "参数的总数为:$# 个"echo "作为一个字符串输出所有的参数:$*"
}funWithParam 1 2 3 4 5 99 78 989 132 123 12312

array

#!/bin/bashmy_array=("A" "B" "C" "D")array_name[0]=value0
array_name[1]=value1
array_name[2]=value2echo "my_array中第一个位置的值为:${my_array[0]}"
echo "array_name中第一个位置的值为:${array_name[0]}"echo "my_array中的所有元素为:${my_array[*]}"
echo "array_name中所有元素为:${array_name[@]}"echo "my_array数组的长度为:${#my_array[@]}"
echo "array_name数组的长度为:${#array_name[*]}"echo "---------------遍历数组第一种方式------------------"for var in ${my_array[*]}
do
echo "$var"
doneecho "---------------遍历数组第二种方式-----------------"arrayNameLength=${#array_name[@]}
for (( i = 0; i < arrayNameLength; i++ ))
doecho "${array_name[$i]}"
done

select

#!/bin/bashecho "What is your facourite OS?"
PS3="Please enter your choice:"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other"
do
break;
done
echo "You have selected $var"

select 和 case

#!/bin/bash
echo "select和case结合使用!"
echo "你想学习什么语言?"
PS3="请输入你的选择:"
select var in java c++ python go javaScript;
do
case $var in"java")echo "恭喜你选择成功.java最牛";;"c++")echo "驱动开发 网路优化 C++ ";;"python")echo "人工智能 机器学习 python";;"go")echo "性能之王 超越各种语言 未来发展支柱 go";;"javaScript")echo "发展悠久 久盛不衰 javaScript";;*)echo "你不是守规矩的人!!";;esacbreak; # 如果这里没有break 将会无限循环
doneecho "你选择的是:$var"

引用其他.sh文件

#!/bin/bash
source ./test23_array.shecho "---------------------------------------------测试引用包含其他文件----------------------------------------"
for var in ${my_array[*]}
doecho "测试引用包含其他文件:$var"
done

综合小案例

猜数字

游戏规则为:程序内置一个1到100 之间的数字作为猜测的结果,由用户猜测此数字。用户每猜测一次,由系统提示猜测结果:大了、小了或者猜对了;直到用户猜对结果,则提示游戏结束。

#!/bin/bashrandomNumber_array[0]=1for(( i = 1; i<100; i++))
do
randomNumber_array[i]=$((i+1))
done#echo "randomeNumber_array:${randomNumber_array[*]}"number=${randomNumber_array[RANDOM%100+1]}while :
doread -p "计算机生成了一个 1‐100 的随机数,你猜: " readNumif [ $readNum -eq $number ]thenecho "猜对了"break;elif [ $readNum -gt $number  ]thenecho "大了"elseecho "小了"fi
done

创建文件,并且拷贝到指定位置

写一个脚本,在用户目录下创建四个文件m1.txt,m2.txt,m3.txt,m4.txt,用Shell编程,实现自动创建m1,m2,m3,m4四个目录,并将 m1.txt,m2.txt,m3.txt,m4.txt四个文件分别拷贝到各自相应的目录下。

#!/bin/bashfor var in m1 m2 m3 m4;
doif [ -e "/home/$var"  ]thenecho "$var已存在,开始删除...."$(rm -rf "/home/$var")fiecho "开始创建文件:$var.txt"$(touch "/home/$var".txt)echo "文件创建成功,等待5s后开始创建$var目录"$(sleep 5s)$(mkdir "/home/$var")echo "$var目录创建成功,等待5s后开始将/home/$var.txt拷贝到/home/$var"$(sleep 5s)$(mv "/home/$var".txt /home/$var)echo "拷贝成功!!"
done

统计/var/log中的文件个数,并打印文件名

写一个shell脚本,统计/var/log 有多少个文件,并显示这些文件名

#!/bin/bashsum=0
for var in $(ls /var/log)
do
#if [ -f $var  ]#thensum=$((sum + 1))echo "$var"
#fi
doneecho "---------------------------------------------------"
echo "/var/log中共有$sum个文件"

用户输入3个数,并按从小到大依次输出

写一个shell脚本,依次提示用户输入 3 个整数,脚本根据数字大小依次排序输出 3 个数字

#!/bin/bashread -p "请输入第一个整数:" num_1read -p "请输入第二个整数:" num_2read -p "请输入第三个整数:" num_3one=0
two=0
three=0
if [ $num_1 -ge $num_2  ]
thenif [ $num_1 -ge $num_3 ]thenthree=$num_1if [ $num_2 -ge $num_3  ]thentwo=$num_2one=$num_3elsetwo=$num_3one=$num_2fielsethree=$num_3two=$num_1one=$num_2fi
elseif [ $num_2 -ge $num_3  ]thenthree=$num_2if [ $num_1 -ge $num_3  ]thentwo=$num_1one=$num_3elsetwo=$num_3one=$num_1fielsethree=$num_3two=$num_2one=$num_1fi
fi
echo "-------------------------------------------------------------------"
echo "你输入的最大值为:$three"
echo "你输入的中间值为:$two"
echo "你输入的最小值为:$one"

相关文章:

Shell脚本的基本例子

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 大数据系列文章目录 目录 定义变量&#xff0c;输出变量输盘输入&#xff0c;执行Lunix命令变量禁止修改变量删除获取传递的变量字符串拼接&…...

C++设计模式介绍与分类

目录 一、设计模式定义 二、设计模式的优点 三、设计模式缺点 四、设计模式中的抽象思维 五、抽象的方法 六、设计模式应用场景 七、设计模式分类 附加知识 &#xff08;1&#xff09;C面向对象三种访问修饰符 &#xff08;2&#xff09;父类析构函数必须为虚函数 &…...

【Redis25】Redis进阶:分布式锁实现

Redis进阶&#xff1a;分布式锁实现 锁这个概念&#xff0c;不知道大家掌握的怎么样。我是先通过 Java &#xff0c;知道在编程语言中是如何使用锁的。一般 Java 的例子会是操作一个相同的文件&#xff0c;但其实我们知道&#xff0c;不管是文件&#xff0c;还是数据库中的一条…...

【蓝桥杯算法题】输入输出流问题

【蓝桥杯算法题】输入输出流问题 题目&#xff1a;对文本文件进行带缓存的读写操作&#xff0c;可以读取文件不同位置的信息&#xff0c;可以进行对象序列化和对象反序列化。解释&#xff1a;总结&#xff1a; 题目&#xff1a;对文本文件进行带缓存的读写操作&#xff0c;可以…...

BUG提交单模版一

提交人员 XX 提交时间 2005-06-16 产品名称...

Android 12.0系统默认授予读写权限给第三方app

1.概述 在12.0的系统rom定制化开发中, 在6.0以前读写权限是默认授予的,app不需要申请权限 在10.0之前需要android.permission.WRITE_EXTERNAL_STORAGE和android.permission.READ_EXTERNAL_STORAGE 权限就可以了而在安卓11的时候继续强化对SD卡读写的管理,引入了MANAGE_EXTER…...

【生信】R语言在RNA-seq中的应用

R语言在RNA-seq中的应用 文章目录 R语言在RNA-seq中的应用生成工作流环境读取和处理数据由targets文件提供实验定义对实验数据进行质量过滤和修剪生成FASTQ质量报告 比对建立HISAT2索引并比对 读长量化读段计数样本间的相关性分析 差异表达分析运行edgeR可视化差异表达结果计算…...

【嵌入式环境下linux内核及驱动学习笔记-(14)linux总线、设备、驱动模型之platform】

目录 1、新驱动架构的导入1.1 传统驱动方式的痛点1.2 总线设备驱动架构 2、platform 设备驱动2.1 platform总线式驱动的架构思想2.2 platform _device相关的数据类型2.2.1 struct platform_device2.2.2 struct platform_device_id2.2.3 struct resource2.2.4 struct device 2.3…...

绝地求生 压q python版

仅做学习交流&#xff0c;非盈利&#xff0c;侵联删&#xff08;狗头保命) 一、概述 1.1 效果 总的来说&#xff0c;这种方式是通过图像识别来完成的&#xff0c;不侵入游戏&#xff0c;不读取内存&#xff0c;安全不被检测。 1.2 前置知识 游戏中有各种不同的q械&#xf…...

云原生技术中的容器技术有哪些?

文章目录 云原生技术中的容器技术有哪些1、云原生的含义2、容器的含义3、云原生的技术的基石&#xff1a;容器技术4、容器技术有哪些? 结语 云原生技术中的容器技术有哪些 在现今的安全行业中云原生安全技术中的容器安全技术有哪些呢&#xff0c;很多用户都不知道具体的含义以…...

Gin中间件的详解 ,用Jwt-go 和 Gin 的安全的登陆的中间件

学习目标: Gin 在不同的group 设置不同的中间件或者过滤器 Gin 的group下的路由上中间件或过滤器 用Jwt-go 和 Gin 的安全的登陆的中间件 JWT 类,它基本有所有基本功能,包括:GenerateToken,GenerateRefreshToken, ValidateToken, ParseToken 学习内容: 1. Gin 在不同的g…...

Nginx网站部署

Nginx网站部署 一、访问状态统计配置二、基于授权的访问控制三、基于客户端的访问控制四、基于域名的 Nginx 虚拟主机五、基于IP 的 Nginx 虚拟主机六、基于端口的 Nginx 虚拟主机 一、访问状态统计配置 1.先使用命令/usr/local/nginx/sbin/nginx -V 查看已安装的 Nginx 是否包…...

Hadoop优化

1.小文件 影响&#xff1a; 元数据的瓶颈在于文件的数量&#xff0c;无论单个文件的大小 资源大材小用 优化 计算&#xff1a;使用combininputformat提前合并小文件 JVM重用 存储&#xff1a;归档 2.map端 环形缓冲区-区域大小、溢写比列 提前combiner&#xff…...

FPGA设计的指导性原则 (中)

1.6基本设计思想与技巧之二:串并转换 串并转换是FPGA设计的一个重要技巧,从小的着眼点讲,它是数据流处理的常用手 段,从大的着眼点将它是面积与速度互换思想的直接体现。串并转换的实现方法多种多样, 根据数据的排序和数量的要求,可以选用寄存器、RAM等实现。前面在乒乓…...

开源创新 协同融合|2023 开放原子全球开源峰会开源协作平台分论坛即将启幕

由开放原子开源基金会主办&#xff0c;阿里云、CSDN 等单位共同承办的开源协作平台分论坛即将于 6 月 12 日上午在北京经开区北人亦创国际会展中心隆重召开。作为 2023 开放原子全球开源峰会的重要组成部分&#xff0c;开源协作平台分论坛将聚焦于开源代码平台的创新功能、用户…...

第四章 相似矩阵与矩阵对角化

引言 题型总结中推荐例题有蓝皮书的题型较为重要&#xff0c;只有吉米多维奇的题型次之。码字不易&#xff0c;如果这篇文章对您有帮助的话&#xff0c;希望您能点赞、评论、收藏&#xff0c;投币、转发、关注。您的鼓励就是我前进的动力&#xff01; 知识点思维导图 补充&…...

课程11:仓储层Repository实现、AutoMapper自动映射

课程简介目录 🚀前言一、Repository项目1.1创建Repository项目1.2 添加类1.2.1、添加类 RolePermissionRepositiory1.2.2、添加项目引用1.2.3、注入数据库上下文1.3 RolePermissionRepositiory接口的实现二、Repository注入2.1 提取接口2.2 添加项目依赖2.3 项目入口添加依赖…...

关于作用域的那些事(进阶)

一、作用域 原理&#xff1a; 作用域 > 房子 > 除了对象的{}都构成一个作用域 作用域 > 为了区别变量.不同作用域内声明的变量是各不相同的.(就算名字相同). 作用域语法: let x 10; (全局变量). if () {块级作用域 let y 20; (局部变量)} for () {块级作用…...

小技巧notebook

小技巧notebook 1、MybatisPlus 批量保存 从BaseMapper接口方法可知&#xff0c;mybatis plus mapper只有根据id批量删除和查询&#xff0c;没有批量保存&#xff08;insert 、update&#xff09;&#xff0c;要实现也很简单&#xff0c;需要定义一个Service Service Slf4j …...

【2451. 差值数组不同的字符串】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个字符串数组 words &#xff0c;每一个字符串长度都相同&#xff0c;令所有字符串的长度都为 n 。 每个字符串 words[i] 可以被转化为一个长度为 n - 1 的 差值整数数组 difference[i] &…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...