shell(三)

声明!
学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!有兴趣的小伙伴可以点击下面连接进入b站主页[B站泷羽sec](https://space.bilibili.com/350329294)

参数传递&数学运算

参数传递

在Shell脚本中,参数传递是通过命令行参数来实现的

  1. $0:当前脚本的文件名。

  2. 2, :传递给脚本的参数。1表示第一个参数,$2表示第二个参数,依此类推。

  3. $#:传递给脚本的参数个数。

  4. $@:传递给脚本的所有参数,以空格分隔。

  5. :传递给脚本的所有参数,以单空格分隔。如果参数中包含空格,*会将整个参数当作一个字符串。

echo 执行文件名是: $0
echo 第一个参数是: $1
echo 传递的参数作为一个字符串显示: $*
echo 传递的参数独立作为每一个字符串显示: $@
echo 传递到脚本的参数个数是: $#
echo 最后命令的退出状态: $?
echo 脚本运行的当前进程ID是: $$

将上述脚本保存为myscript.sh,并赋予执行权限:

chmod +x myscript.sh

运行脚本并传递参数:

./myscript.sh arg1 arg2 "arg 3"

输出结果:

Script name: ./myscript.sh
First argument: arg1
Second argument: arg2
All arguments: arg1 arg2 arg 3
Number of arguments: 3

传递多个参数

#!/bin/bash# 输出参数信息
echo "Script name: $0"
echo "First argument: $1"
echo "Second argument: $2"
echo "Third argument: $3"
echo "All arguments: $@"
echo "Number of arguments: $#"

将上述脚本保存为myscript.sh,并赋予执行权限:

chmod +x myscript.sh

运行脚本并传递多个参数:

./myscript.sh arg1 arg2 arg3

输出结果:

Script name: ./myscript.sh
First argument: arg1
Second argument: arg2
Third argument: arg3
All arguments: arg1 arg2 arg3
Number of arguments: 3

如果传递一个包含空格的参数,需要用双引号将其括起来

./myscript.sh arg1 "arg 2 with spaces" arg3

这将确保参数被正确识别,输出结果:

Script name: ./myscript.sh
First argument: arg1
Second argument: arg 2 with spaces
Third argument: arg3
All arguments: arg1 arg 2 with spaces arg3
Number of arguments: 3

数组处理参数

在Shell脚本中,可以使用数组来处理多个参数

#!/bin/bash# 创建一个数组来存储参数
params=("$@")# 获取参数个数
num_params=${#params[@]}# 输出参数信息
echo "Script name: $0"
echo "Number of arguments: $num_params"
echo "All arguments:"# 遍历数组并输出每个参数
for (( i=0; i<$num_params; i++ )); doecho "Argument $(($i+1)): ${params[$i]}"
done

将上述脚本保存为myscript.sh,并赋予执行权限:

chmod +x myscript.sh

运行脚本并传递多个参数:

./myscript.sh arg1 arg2 "arg 3 with spaces"

参数组合

在Shell脚本中实现参数组合,通常意味着根据不同的参数组合执行不同的操作。这可以通过检查传递给脚本的参数并使用条件语句来实现。

#!/bin/bash# 检查参数个数
if [ "$#" -lt 1 ]; thenecho "Usage: $0 [option1] [option2] [option3]"exit 1
fi# 根据参数执行不同操作
while getopts ":a:b:c" opt; docase $opt ina)echo "Option A selected"# 在此处执行选项A的操作;;b)echo "Option B selected"# 在此处执行选项B的操作;;c)echo "Option C selected"# 在此处执行选项C的操作;;\?)echo "Invalid option: -$OPTARG" >&2exit 1;;:)echo "Option -$OPTARG requires an argument." >&2exit 1;;esac
done# 如果没有提供任何参数,显示帮助信息
if [ "$OPTIND" -eq 1 ]; thenecho "No options provided. Use -a, -b, or -c."
fi

循环使用参数

在Shell脚本中,可以使用for循环来遍历并处理传递给脚本的参数

#!/bin/bash# 获取参数个数
num_params=$## 输出参数信息
echo "Script name: $0"
echo "Number of arguments: $num_params"# 使用for循环遍历并处理每个参数
for (( i=1; i<=$num_params; i++ )); doecho "Processing argument $i: ${!i}"
done

$#获取传递给脚本的参数个数。for循环遍历参数。${!i}访问当前循环索引对应的参数。

参数组合的嵌套

在Shell脚本中实现参数组合的嵌套,意味着根据多个参数的组合执行不同的操作,并且这些参数可以嵌套使用。

#!/bin/bash# 定义一个函数来处理参数组合
process_args() {local option_a=falselocal option_b=falselocal option_c=falsewhile getopts ":a:b:c" opt; docase $opt ina)option_a=true;;b)option_b=true;;c)option_c=true;;\?)echo "Invalid option: -$OPTARG" >&2exit 1;;:)echo "Option -$OPTARG requires an argument." >&2exit 1;;esacdone# 根据参数组合执行不同操作if $option_a; thenecho "Option A selected"# 在此处执行选项A的操作fiif $option_b; thenecho "Option B selected"# 在此处执行选项B的操作fiif $option_c; thenecho "Option C selected"# 在此处执行选项C的操作fi# 嵌套参数组合if $option_a && $option_b; thenecho "Option A and B selected"# 在此处执行选项A和B的组合操作fiif $option_a && $option_c; thenecho "Option A and C selected"# 在此处执行选项A和C的组合操作fiif $option_b && $option_c; thenecho "Option B and C selected"# 在此处执行选项B和C的组合操作fiif $option_a && $option_b && $option_c; thenecho "Option A, B, and C selected"# 在此处执行选项A、B和C的组合操作fi
}# 调用函数处理参数
process_args "$@"

参数传递的映射

在Shell脚本中,可以使用关联数组(associative arrays)来实现参数传递的映射

#!/bin/bash# 声明一个关联数组
declare -A param_map# 定义映射关系
param_map=(["arg1"]="value1"["arg2"]="value2"["arg3"]="value3"
)# 获取参数个数
num_params=$## 使用for循环遍历并处理每个参数
for (( i=1; i<=$num_params; i++ )); doarg_name=${!i}echo "Processing argument $arg_name: ${param_map[$arg_name]}"
done

数学运算

方法1:使用expr命令

expr是一个用于数学运算的外部命令。

#!/bin/basha=10
b=20# 加法
sum=$(expr $a + $b)
echo "Sum: $sum"# 减法
difference=$(expr $a - $b)
echo "Difference: $difference"# 乘法
product=$(expr $a \* $b)
echo "Product: $product"# 除法(注意:结果为整数)
quotient=$(expr $b / $a)
echo "Quotient: $quotient"# 取余
remainder=$(expr $b % $a)
echo "Remainder: $remainder"

方法2:使用$((...))$(())

这种方法允许在Shell脚本中直接进行数学运算,无需调用外部命令。

#!/bin/basha=10
b=20# 加法
sum=$((a + b))
echo "Sum: $sum"# 减法
difference=$((a - b))
echo "Difference: $difference"# 乘法
product=$((a * b))
echo "Product: $product"# 除法(注意:结果为整数)
quotient=$((b / a))
echo "Quotient: $quotient"# 取余
remainder=$((b % a))
echo "Remainder: $remainder"

方法3:使用bc命令

bc是一个用于任意精度数学运算的外部命令。它可以处理浮点数运算。

#!/bin/basha=10.5
b=20.7# 加法
sum=$(echo "$a + $b" | bc)
echo "Sum: $sum"# 减法
difference=$(echo "$a - $b" | bc)
echo "Difference: $difference"# 乘法
product=$(echo "$a * $b" | bc)
echo "Product: $product"# 除法
quotient=$(echo "scale=2; $b / $a" | bc)
echo "Quotient: $quotient"

在使用bc命令时,可以通过scale变量设置结果的小数位数。

条件判断

在Shell脚本中,可以使用if语句进行条件判断

示例1:基本条件判断

#!/bin/bashnum=10if [ $num -gt 5 ]; thenecho "Number is greater than 5"
elif [ $num -lt 5 ]; thenecho "Number is less than 5"
elseecho "Number is equal to 5"
fi

示例2:判断文件是否存在

#!/bin/bashfile="example.txt"if [ -e "$file" ]; thenecho "File exists"
elseecho "File does not exist"
fi

示例3:判断字符串是否为空

#!/bin/bashstr="Hello, World!"if [ -z "$str" ]; thenecho "String is empty"
elseecho "String is not empty"
fi

示例4:使用逻辑运算符组合条件

#!/bin/bashnum=10
flag=trueif [ $num -gt 5 ] && [ "$flag" = true ]; thenecho "Number is greater than 5 and flag is true"
elif [ $num -lt 5 ] || [ "$flag" = false ]; thenecho "Number is less than 5 or flag is false"
elseecho "Number is equal to 5 and flag is neither true nor false"
fi

示例5:使用case语句进行多条件判断

#!/bin/bashday_of_week="Monday"case $day_of_week in"Monday")echo "Today is Monday";;"Tuesday")echo "Today is Tuesday";;"Wednesday")echo "Today is Wednesday";;"Thursday")echo "Today is Thursday";;"Friday")echo "Today is Friday";;*)echo "Weekend!";;
esac

循环计算

在Shell脚本中实现循环计算,可以使用for循环和while循环。以下是两种循环结构的示例:

使用for循环

for循环通常用于遍历一个序列(例如,数字范围、数组元素等)并对每个元素执行一定的操作。

#!/bin/bashstart=1
end=5# 使用for循环计算1到5的和
sum=0
for ((i=start; i<=end; i++)); dosum=$((sum + i))
doneecho "The sum of numbers from $start to $end is: $sum"

使用while循环

while循环在给定条件为真时重复执行一段代码。

#!/bin/bashstart=1
end=5# 使用while循环计算1到5的和
sum=0
i=$start
while [ $i -le $end ]; dosum=$((sum + i))i=$((i + 1))
doneecho "The sum of numbers from $start to $end is: $sum"

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

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

相关文章

Unity-添加世界坐标系辅助线

如果你想在场景中更直观地显示世界坐标系&#xff0c;可以通过编写一个简单的脚本来实现。下面是一个基本的示例脚本&#xff0c;它会在场景中绘制出世界坐标系的三个轴&#xff1a; using UnityEngine;public class WorldAxesIndicator : MonoBehaviour {public float length…

解密自闭症儿童康复秘籍,让孩子重新展开羽翼

在广州这座繁华都市的一隅&#xff0c;隐藏着一片静谧而温暖的天地——星贝育园自闭症儿童寄宿制学校。这里&#xff0c;没有喧嚣与浮躁&#xff0c;只有爱与耐心交织的旋律&#xff0c;为自闭症儿童编织着一个又一个康复的奇迹。星贝育园&#xff0c;如同一盏明灯&#xff0c;…

豆包MarsCode算法题:三数之和问题

问题描述 思路分析 1. 排序数组 目的: 将数组 arr 按升序排序&#xff0c;这样可以方便地使用双指针找到满足条件的三元组&#xff0c;同时避免重复的三元组被重复计算。优势: 数组有序后&#xff0c;处理两个数和 target - arr[i] 的问题可以通过双指针快速找到所有可能的组…

计算机网络socket编程(5)_TCP网络编程实现echo_server

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络socket编程(5)_TCP网络编程实现echo_server 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交…

游戏引擎学习第21天

虽然没有上一节的难但是内容也很多 关于实现和使用脚本语言 以下是详细复述&#xff1a; 许多人经常问一个问题&#xff0c;反复问过好几次&#xff0c;那就是&#xff1a;是否会在项目中实现脚本语言。这个问题的具体形式通常是&#xff1a;你们会使用脚本语言吗&#xff1…

《线性代数的本质》

之前收藏的一门课&#xff0c;刚好期末复习&#xff0c;顺便看一看哈哈 课程链接&#xff1a;【线性代数的本质】合集-转载于3Blue1Brown官方双语】 向量究竟是什么 线性代数中最基础、最根源的组成部分就是向量&#xff0c;需要先明白什么是向量 不同专业对向量的看法 物理专…

Django+Nginx+uwsgi网站使用Channels+redis+daphne实现简单的多人在线聊天及消息存储功能

网站部署在华为云服务器上&#xff0c;Debian系统&#xff0c;使用DjangoNginxuwsgi搭建。最终效果如下图所示。 一、响应逻辑顺序 1. 聊天页面请求 客户端请求/chat/&#xff08;输入聊天室房间号界面&#xff09;和/chat/room_name&#xff08;某个聊天室页面&#xff09;链…

「Mac玩转仓颉内测版21」基础篇1 - 仓颉程序的基本组成

本篇将系统介绍Cangjie编程语言中程序的基本组成部分&#xff0c;涵盖 main 函数的定义、包与模块的使用、变量类型、作用域和代码结构原则&#xff0c;帮助开发者理解Cangjie程序的整体结构。 关键词 程序入口点main函数包与模块变量类型与作用域值类型与引用类型代码结构与规…

鸿蒙多线程开发——线程间数据通信对象03(sendable)

1、简 介 在传统JS引擎上&#xff0c;对象的并发通信开销的优化方式只有一种&#xff0c;就是把实现下沉到Native侧&#xff0c;通过Transferable对象的转移或共享方式降低并发通信开销。而开发者仍然还有大量对象并发通信的诉求&#xff0c;这个问题在业界的JS引擎实现上并没…

OpenHarmony-3.驱动HDF

OpenHarmony HDF 框架 1.OpenHarmony HDF 框架概述 OpenHarmony驱动子系统采用C面向对象编程模型构建&#xff0c;通过平台解耦、内核解耦&#xff0c;兼容不同内核&#xff0c;提供了归一化的驱动平台底座&#xff0c;旨在为开发者提供更精准、更高效的开发环境&#xff0c;力…

ESP8266 STA模式TCP客户端 电脑手机网络调试助手

1.STA模式TCP客户端和电脑网络调试助手 2.STA模式TCP客户端和手机网络调试助手

[C/C++][FFmpeg] 关于avcodec_send_frame(encoder_ctx, NULL) 的解释

使用FFmpeg&#xff0c;明明看起来已经写完文件了&#xff0c;但是临近末尾还要执行下面这段 // 刷新编码器 avcodec_send_frame(encoder_ctx, NULL); while (avcodec_receive_packet(encoder_ctx, packet) > 0) {av_interleaved_write_frame(output_format_ctx, packet);a…

【JavaEE进阶】 JavaScript

本节⽬标 了解什么是JavaScript, 学习JavaScript的常⻅操作, 以及使⽤JQuery完成简单的⻚⾯元素操作. 一. 初识 JavaScript 1.JavaScript 是什么 JavaScript (简称 JS), 是⼀个脚本语⾔, 解释型或即时编译型的编程语⾔. 虽然它是作为开发Web⻚⾯的脚本语⾔⽽出名&#xff0c;…

神经网络(系统性学习一):入门篇——简介、发展历程、应用领域、基本概念、超参数调优、网络类型分类

相关文章&#xff1a; 神经网络中常用的激活函数 神经网络简介 神经网络&#xff08;Neural Networks&#xff09;是受生物神经系统启发而设计的数学模型&#xff0c;用于模拟人类大脑处理信息的方式。它由大量的节点&#xff08;或称为“神经元”&#xff09;组成&#xff0…

缓冲区的奥秘:解析数据交错的魔法

目录 一、理解缓存区的好处 &#xff08;一&#xff09;直观性的理解 &#xff08;二&#xff09;缓存区的好处 二、经典案例分析体会 &#xff08;一&#xff09;文件读写流&#xff08;File I/O Buffering&#xff09; BufferedOutputStream 和 BufferedWriter 可以加快…

SpringBoot 集成 html2Pdf

一、概述&#xff1a; 1. springboot如何生成pdf&#xff0c;接口可以预览可以下载 2. vue下载通过bold如何下载 3. 一些细节&#xff1a;页脚、页眉、水印、每一页得样式添加 二、直接上代码【主要是一个记录下次开发更快】 模板位置 1. 导入pom包 <dependency><g…

MySQL Join 的原理与优化实践

文章目录 引言一、基础准备&#xff1a;创建环境与示例数据1. 初始化示例表2. 示例 Join 查询3. EXPLAIN 输出分析 二、MySQL Join 的核心算法与执行机制1. 三种 Join 算法的实现与原理1.1 Index Nested-Loop Join&#xff08;INLJ&#xff09;1.2 Simple Nested-Loop Join&…

阿里Qwen系列开源模型介绍

模型种类丰富 Qwen2&#xff1a;包含Qwen2-0.5b、Qwen2-1.5b、Qwen2-7b、Qwen2-57b-a14b以及Qwen2-72b等五种规模的预训练和指令微调模型&#xff0c;其在多语言处理、长文本处理、代码生成、数学和逻辑推理等能力上&#xff0c;在mmlu、gpqa、humaneval等国际测评中得到了验证…

Redis设计与实现 学习笔记 第二十章 Lua脚本

Redis从2.6版本引入对Lua脚本的支持&#xff0c;通过在服务器中嵌入Lua环境&#xff0c;Redis客户端可以使用Lua脚本&#xff0c;直接在服务器端原子地执行多个Redis命令。 其中EVAL命令可以直接对输入的脚本进行求值&#xff1a; 而使用EVALSHA命令则可以根据脚本的SHA1校验…

【042A】基于51单片机门禁系统【Proteus仿真+Keil程序+报告+原理图】

☆、设计硬件组成&#xff1a;51单片机最小系统RFID读卡器继电器蜂鸣器LED灯。 1、设计采用STC89C51/52、AT89C51/52、AT89S51/52作为主控芯片&#xff1b; 2、通过RC522读卡器读取IC卡信息&#xff0c;信息匹配继电器吸合门锁打开&#xff1b; 3、可通过上位机对IC卡进行注…