Shell 脚本传递参数的两种方式:位置传参与指令式传参

news2024/12/26 13:43:22

Shell 脚本传递参数的两种方式

方式一:数字传参

直接传参

数字传递可以用$1 $2 $3 ......获取第一个第二个第三个参数,$0获取命令(也就是你的文件名),$#可以查看总的参数个数
以下文件命名为param1(shell脚本不需要以.sh结尾)

#!/bin/bash                                                                                  
echo "脚本(文件名称)$0"
echo "第一个参数$1"
echo "第二个参数$2"
echo "总共有$#个参数"

在以上代码中,通过定义$1 $2 $3 ...的方式来获取第一个、第二个、第三个…参数,使用时只需要

└─$ ./param1 1 2 3 4 5
脚本(文件名称)./param1
第一个参数1
第二个参数2
总共有5个参数

可以看到上面的shell脚本中,我只写了两个参数,但是输入的时候输入了5个参数,最终总数$#识别为5个参数,还有一种写法即使输入多个参数也会被识别为规定的参数,后面会有说明,以上代码的截图以及运行结果如下

在这里插入图片描述

注意事项:超过10个参数需要加上{}

#!/bin/bash                                                                                  
echo "脚本名$0"
echo "第一个参数$1"
echo "第二个参数$2"
echo "第三个参数$3"
echo "第四个参数$4"
echo "第五个参数$5"
echo "第六个参数$6"
echo "第七个参数$7"
echo "第八个参数$8"
echo "第九个参数$9"
echo "第十个参数$10"
echo "第十个参数${10}"

在以上代码中输入10个参数:

~/Desktop $ ./param2 a b c d e f g h i j
脚本名./param2
第一个参数a
第二个参数b
第三个参数c
第四个参数d
第五个参数e
第六个参数f
第七个参数g
第八个参数h
第九个参数i
第十个参数a0
第十个参数j

可以发现如果用$10来表示第十个参数,shell编译器会识别为$1"0",因此输出的会是第一个参数与一个字符串0(尽管只有一个字符),若是需要获得第十个参数,需要写成${10}

横岗-传参

在Linux命令中,命令后面的参数都会有-来打头,以区分是什么参数有什么作用,比如:

ls -l  # 查看文件的详细信息
ps -ef # 查看进程详情
rm -rf # 递归的删除文件及文件夹

在我自己写脚本的时候,也遇到了这种需求,比如我的一个脚本在最开始的时候会挂载一个硬盘,硬盘默认位置是/dev/sda1,挂载位置默认是/mnt/500G(这是一个500G的硬盘),若是插入了其他磁盘设备那么该硬盘可能会变为/dev/sdb1甚至dc、dd等,当然挂载位置也可能因为我的需求改变,因此我写了以下脚本:

DEV="/dev/sda1"
MNT="/mnt/500G"

if [ $1 ]; then
	DEV=$1
fi

if [ $2 ]; then
	MNT=$2
fi	
sudo mount $DEV $MNT
# ...

这样的话就可以自己指定磁盘与挂载位置,但是有一个问题,我可以使用一个参数指定挂载磁盘,比如我要将磁盘改为/dev/sdb1,我只需要(假设该脚本文件名称为aa

aa /dev/sdb1

就可以获取第一个参数以指定磁盘,但是我却不可以仅用一个参数指定MNT也就是挂载位置,因为这个参数被放在第二位,因此即使我的挂载磁盘不改变仅改变挂载位置,也需要重新输入一遍DEV,如下:

aa /dev/sda1 /mnt/Other_File

这样显然是很麻烦的,因此就考虑到是否可以直接用-d来指定磁盘,用-m来指定挂载位置呢?于是乎需要挂载的时候仅使用:

mount -d /dev/sdb1 # 指定磁盘
mount -m /mnt/600G # 指定挂载位置

于是乎,正片开始,使用-来传参:

#!/bin/bash                                                                                         

while getopts ":d:m:" opt
do
        case $opt in
                d)
                        echo "-d:参数为::"$OPTARG
                        ;;
                m)
                        echo "-m:参数为::"$OPTARG
                        ;;
                ?)
                echo "未知参数"
                exit 1;;
        esac
done

以上脚本通过一个while循环,查找输入的参数的前缀,如果有-m字样的内容,就向下进行case(类似于Java中的Switch),然后若是能匹配到下面的字母就进行输出参数,匹配不到的话就输出为止参数,改脚本的运行结果如下:

└─$ ./param4 -m 123 -d 123456 -f 1234565432sfdgsd
-m:参数为::123
-d:参数为::123456
未知参数

这样就可以避免掉用数字传参必须要按照位置排序的弊端

在这里插入图片描述

写到这里,尽可以使用./(或者路径的方式)来使用,若是想像Linux命令一样,仅输入一个命令就能执行的话,可以将脚本复制到/bin目录下(或者link过去)。









参考文章:「CSDN」shell中脚本参数传递的两种方式

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

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

相关文章

rk3568平台调试typec口实现uvc输出,网络共享等功能

一、修改kernel相关配置 注意:一定要知道主控接线,那个物理口是otg的,然后要找准与之所连接的phy和控制器。然后处理CC1 CC2识别芯片,fusb302。默认sdk自带有驱动,需要配上中断脚和提供VBUS 5V的脚。用来判断角色是DF…

( “ 图 “ 之 拓扑排序 ) 210. 课程表 II ——【Leetcode每日一题】

❓210. 课程表 II 难度:中等 现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1。给你一个数组 prerequisites ,其中 prerequisites[i] [ai, bi] ,表示在选修课程 ai 前 必须 先选修 bi 。 例如,想要学…

使用 docker 搭建 mysql 主从配置

真正的配置文件是docker中 /etc/my.cnf 拉取镜像 docker pull mysql:5.7启动主数据库和从数据库 docker run -p 3306:3306 --restartalways --name mysql_v1 -v /var/mysql/mysql_v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORDroot -d mysql:5.7 docker run -p 3307:3306 --res…

Neural Network笔记2

torch.nn: Containers: 神经网络骨架 Convolution Layers 卷积层 Pooling Layers 池化层 Normalization Layers 正则化层 Non-linear Activations (weighted sum, nonlinearity) 非线性激活 Convolution Layers Conv2d torch.nn.Conv2d(in_channels, out_channels, ke…

java版企业电子招投标系统源码 spring boot+mybatis+前后端分离

项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及…

一体化管理系统如何使企业受益?

在当今世界,大多数企业使用管理系统来制定政策和程序,以帮助实现其业务目标。管理体系是用于确保企业能够管理实现其目标所需的所有任务的流程和程序的结构。 公司或企业会有支持客户、采购、项目、考勤、财务等管理系统,这些管理系统通常在…

OBCP部分考点总结

备份恢复: 恢复的最小力度:租户级 分布式事务: 参与者或者协调者宕机,全部参与者发送prepare ok,客户端会commit sql引擎: 不能使用常量的场景:between and 应该可以使用常量,被…

菁染料CY3标记氨Cyanine3-amine合成方式2247688-56-6

CY3-amine是一种荧光染料,其分子式为C36H52Cl2N4O ,分子质量616.745,具有良好的荧光性能和化学稳定性。 产品名称:菁染料CY3标记氨基;三甲川花菁染料标记氨基 英文名称:Cy3-amine;Cyanine3-amine 品牌商&a…

论文ai生成-一键生成论文的软件

ChatGPT自动写论文 ChatGPT可以使用生成的文本来帮助撰写学术论文,其中包括文章的大纲、段落和句子。但是,它并不会像一个完全替代人的写作工具一样让你“自动”写作。 虽然ChatGPT可以生成相当准确的语言,但它并不完美,它并不能…

Websocket的基本认识、使用与封装

目录 一、Websocket是什么 二、Websocket的基本使用 使用介绍 第一步 第二步 第三步 第四步 常用API介绍 WebSocket(url[, protocols]) WebSocket.readyState WebSocket.send(data) WebSocket.close([code[, reason]]) WebSocket.bufferedAmount WebSocket.exten…

顺序表功能实现(入手版详解)

🍉博客主页:阿博历练记 📖文章专栏:数据结构与算法 🚚代码仓库:阿博编程日记 🌹欢迎关注:欢迎友友们点赞收藏关注哦 文章目录 🍓前言✨顺序表🔍1.顺序表的整体…

【SpringBoot】SpringBoot 优雅地校验参数

1、为什么要校验参数? 在日常的开发中,为了防止非法参数对业务造成影响,需要对接口的参数进行校验,以便正确性地入库。 例如:登录时,就需要判断用户名、密码等信息是否为空。虽然前端也有校验,…

剑指offer 栈习题训练经验总结(未完)

第一题 定义栈的数据结构&#xff0c;请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中&#xff0c;调用 min、push 及 pop 的时间复杂度都是 O(1)。 class MinStack {private:stack<int> s;stack<int> min_s;public:void push(int x) {s.push(x);if…

xxl-job 集成 SpringBoot 使用

文章目录 前言xxl-job 集成 SpringBoot 使用1. xxl-job 安装部署超链接2. 启动xxl-job3. 集成 SpringBoot 使用3.1. 添加依赖3.2. 执行器 配置3.3. 执行器组件配置3.4. XxlJob 开发步骤 4. &#xff08;BEAN模式&#xff09;示例5. GLUE(Java) 示例6. 注意 前言 如果您觉得有用…

视觉震撼的数据可视化示例

众所周知&#xff0c;数据可以非常强大——当你真正理解它告诉你什么时。 数据和信息可视化(数据可视化或信息可视化)是对大量复杂的定量、定性数据、信息进行设计和创建易于沟通、易于理解的图形或视觉表示的实践&#xff0c;在静态、动态或交互式视觉项目的帮助下&#xff0…

Java对象的创建方式以及对象的引用

日子就是这么的庸常&#xff0c;却有细碎的事物&#xff0c;如太阳碎碎的光芒&#xff0c;洒落其上 Java创建对象有几种方式 new创建新对象 new创建我们就很熟悉了&#xff0c;像Person p new Person();等等 通过反射机制 这种创建对象的方式就是当我们编译时不知道要创…

java面试,redis面试,java面试大全

LEARNING_CONTENT 一个分布式锁的解决方案&#xff0c;另一个是分布式事务的解决方案 -2 flink 链接&#xff1a;flink参考文章 -1 linux of view 参考链接&#xff1a; linux常见面试题 linux查看占用cup最高的10个进程的命令&#xff1b; 参考文章&#xff1a;linux查看…

uboot 启动内核代码分析

0、uboot和内核区别 uboot的本质就是一个复杂点的裸机程序。内核本身也是一个"裸机程序“&#xff0c;和uboot、和其他裸机程序并没有本质区别。 区别就是操作系统运行起来后在软件上分为内核层和应用层&#xff0c;分层后两层的权限不同&#xff0c;在内存访问和设备操作…

iptables 防火墙进出控制

iptables 防火墙进出控制 iptables简介 iptables 是集成在 Linux 内核中的包过滤防火墙系统。使用 iptables 可以添加、删除具体的过滤规则&#xff0c;iptables 默认维护着 4 个表和 5 个链&#xff0c;所有的防火墙策略规则都被分别写入这些表与链中。 “四表”是指 iptab…

ES是如何解决高可用

https://www.cnblogs.com/crazymakercircle/p/15433680.html ES是一个分布式全文检索框架&#xff0c;隐藏了复杂的处理机制&#xff0c;核心数据分片机制、集群发现、分片负载均衡请求路由。 ES的高可用架构&#xff0c;总体如下图&#xff1a; 说明&#xff1a;本文会以pdf…