超详细Shell学习教程第四篇shell脚本参数化

2023-11-08

目录

1.1参数化实例

 1.2参数处理说明

1.3带返回值的参数


书写带参数的shell脚本:

1.1参数化实例

创建bash1.sh

#!/bin/bash

echo "Shell 传递参数实例!";
echo "第一个参数为:$1";

echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";

运行脚本:

root@ubuntu:/home/lulu/Desktop/Test# ./bash1.sh 
Shell 传递参数实例!
第一个参数为:
参数个数为:0
传递的参数作为一个字符串显示:

root@ubuntu:/home/lulu/Desktop/Test# ./bash1.sh 1,2,3,4
Shell 传递参数实例!
第一个参数为:1,2,3,4
参数个数为:1
传递的参数作为一个字符串显示:1,2,3,4

root@ubuntu:/home/lulu/Desktop/Test# ./bash1.sh 1 2 3 4
Shell 传递参数实例!
第一个参数为:1
参数个数为:4
传递的参数作为一个字符串显示:1 2 3 4

$* 与 $@ 区别:

相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。

创建脚本bash.sh:
for i in "$*"; do
            echo $i
    done;
root@ubuntu:/home/lulu/Desktop/Test# chmod +x bash.sh 
root@ubuntu:/home/lulu/Desktop/Test# ./bash.sh  1 2
1 2


创建脚本bash2.sh
for i in "$@"; do
            echo $i
    done;
root@ubuntu:/home/lulu/Desktop/Test# chmod +x bash2.sh 
root@ubuntu:/home/lulu/Desktop/Test# ./bash2.sh  1 2
1
2
echo "执行脚本名称:$0";
echo "获取第一个参数:$1";
echo "获取第二个参数$2";
echo "获取到的参数$*";
echo "获取参数个数$#";
echo "获取的参数每个参数都是一个(str):$@";
echo "读取当前参数(pid):$$";


root@ubuntu:/home/lulu/Desktop/Test# sh test.sh 
执行脚本名称:test.sh
获取第一个参数:
获取第二个参数
获取到的参数
获取参数个数0
获取的参数每个参数都是一个(str):
读取当前参数(pid):20680
root@ubuntu:/home/lulu/Desktop/Test# sh test.sh 1 2 3
执行脚本名称:test.sh
获取第一个参数:1
获取第二个参数2
获取到的参数1 2 3
获取参数个数3
获取的参数每个参数都是一个(str):1 2 3
读取当前参数(pid):20685

 1.2参数处理说明

$#  传递到脚本或函数的参数个数

$*  以一个单字符串显示所有向脚本传递的参数

$$  脚本运行的当前进程ID号

$!  后台运行的最后一个进程的ID号

$@  与$*相同,但是使用时加引号,并在引号中返回每个参数。

$-  显示Shell使用的当前选项,与set命令功能相同。

$?  显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

1.3带返回值的参数

funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"

脚本执行: 

root@ubuntu:/home/lulu/Documents# ./funWithReturn.sh 
这个函数会对输入的两个数字进行相加运算...
输入第一个数字: 
1
输入第二个数字: 
2
两个数字分别为 1 和 2 !
root@ubuntu:/home/lulu/Documents# echo "输入的两个数字之和为 $? !"
输入的两个数字之和为 3 !

关于文件名带空格的处理方法:

#example ./test.sh 2022\ a.text  2022\ b.txt 
##添加这行代码
IFS=$(echo -en "\n\b")

OLD_File=$1
NEW_FIle=${2}

comm -23 grep -E "reg"  ${OLD_File}  ${NEW_FIle} 

 关于文件名带空格的处理方法:

#example ./test.sh 2022\ a.text  2022\ b.txt 
##添加这行代码
IFS=$(echo -en "\n\b")

OLD_File=$1
NEW_FIle=${2}

comm -23 grep -E "reg"  ${OLD_File}  ${NEW_FIle} 

shell判断问题

推荐使用
  if [[ "x$inputValue" == "xy" || "x$inputValue" == "xY" ]]
  then
  fi; 
防止出现异常

read超时

function input_name(){
    echo -e "===================================================================="
    echo -e "enter input_name function"
    echo -e "===================================================================="

    echo -e "do you want input a new names instead of the previous name(please input y/n)"; read -t inputValue
    if [[ "x$inputValue" == "xy" || "x$inputValue" == "xY" ]]
    then
        echo -e "the previous names is: ${name}, do you want input another name(please input y/n)?";  read  inputValue
        if [[ "x$inputValue" == "xy" || "x$inputValue" == "xY" ]]
        then
           echo -e "the previous name is: ${name}, please choose one of the following name input"
           nameList=$(cat names.txt | grep name |awk {'print $1'} | sort -u | paste -sd " ")
           nameArr=(`echo ${nameList} |awk '{len=split($0,a," ");for(i=1;i<=len;i++) print a[i]}'`)
           echo -e "${nameList}"
           echo -e "please input  name:(if you not input name during 30 seconds, we will use default name:${name} )"; read -t $timeout newName
        fi;

    fi;

    echo -e ""

    if [[ -n $newName ]]
    then
        ## 数组包含
        if [[ "${nameArr[@]}" =~ "$newName" ]]
        then
            name=$newName
        else
            echo -e "the name (${name}) you input is not in nameList(${nameList})"
            exit 0;
        fi;

    fi;
    echo -e "do you want input new namespace during executing menu x (please input  y/n)"; read -t inputValue

    echo -e "current name is: ${name}"
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

超详细Shell学习教程第四篇shell脚本参数化 的相关文章

  • 如何在 bash_profile 文件中添加导出语句?

    我正在尝试了解是否必须添加导出语句来在 bash profile 文件中设置变量 我该怎么做呢 例如 如果我必须添加 export AX name 那么我应该将其简单地写在文件末尾还是我还需要编写其他内容 简单写一下export AS na
  • 从预提交挂钩中排除某些文件类型

    我想要一个预提交 git 钩子来检查 如果可能的话 自动删除 尾随空格 In 让 git 在提交之前自动删除尾随空格 https stackoverflow com questions 591923 make git automatical
  • 命令中的 Bash 变量扩展[重复]

    这个问题在这里已经有答案了 DATE 1 week ago date date DATE 不起作用 我怎样才能让它发挥作用 我可以做 DATE CMD date date DATE eval DATE CMD 但我不想将整个命令存储在变量中
  • Linux下单个目录下文件过多会怎样?

    如果一个目录中有大约 1 000 000 个单独的文件 大部分大小为 100k 其中没有其他目录和文件 是否会以任何其他可能的方式降低效率或产生缺点 ARG MAX 会对此提出异议 例如 rm rf 在目录中时 会说 参数太多 想要执行某种
  • 为什么使用signalfd无法捕获SIGSEGV?

    我的系统是ubuntu 12 04 我将示例修改为man 2 signalfd 并添加sigaddset mask SIGSEGV 在示例中 但我无法得到输出SIGSEGV被生成 这是一个错误吗glibc 源代码片段如下 sigemptys
  • 使用 sed 将反斜杠替换为斜杠[重复]

    这个问题在这里已经有答案了 我需要更换 with 我有一个文件 其中包含 test test2 test3 test4 I tried VRS Ruta cat ruta lst sed s g sed s g output test te
  • 无法连接到 Azure Ubuntu VM - 公钥被拒绝

    我们在 Azure 上使用 Ubuntu VM 一段时间了 很少遇到任何问题 然而 其中一台虚拟机最近出现了问题 出乎意料的是 Ubuntu VM 开始拒绝公钥 ssh i azure key email protected cdn cgi
  • Python 子进程:无法转义引号

    我知道以前曾问过类似的问题 但它们似乎都是通过重新设计参数的传递方式 即使用列表等 来解决的 但是 我这里有一个问题 因为我没有这个选项 有一个特定的命令行程序 我使用的是 Bash shell 我必须向其传递带引号的字符串 它不能不被引用
  • Linux 中有没有一种轻量级的方法来获取当前进程数?

    我希望我的 基于 C C 的 程序显示一个数字指示器 指示本地系统上当前有多少个进程 将经常查询正在运行的进程数值 例如每秒一次 以更新我的显示 有没有一种轻量级的方法来获取该数字 显然我可以调用 ps ax wc l 但我不想强迫计算机生
  • 通过 Node.js 运行 bash 脚本 - 非法选项 -o pipelinefail

    我正在尝试使用 Node js 执行 bash 脚本child process exec 然而它在文件的第二行爆炸 usr bin env bash set eo pipefail TRACE set x echo we are here
  • grep 彩色线条

    我编写了一个简单的 PHP shell 脚本 它解析文件并输出某些元素 它产生大量的输出 采用不同的 bash 颜色 绿色表示正常 黄色表示警告 红色表示错误等 在开发过程中我想过滤掉一些行 例如 所有包含红色文本的行 我可以使用grep
  • 通过名称获取进程ID

    我想在 Linux 下获得一个给定其名称的进程 ID 有没有一种简单的方法可以做到这一点 我还没有在 C 上找到任何可以轻松使用的东西 如果追求 易于使用 char buf 512 FILE cmd pipe popen pidof s p
  • 打印 STDOUT/STDERR 并将它们写入 Bash 中的文件?

    有没有办法让 Bash 将 STDOUT STDERR 重定向到文件 但仍然将它们打印到终端 这会将 STDOUT 和 STDERR 重定向到同一个文件 some command 2 gt 1 tee file log Example to
  • EULA 接受 Bash 脚本

    我有一个尝试安装垃圾箱的脚本 除了 bin 在 more 中打开 EULA 之外 一切正常 在脚本再次开始并自行完成安装之前 您必须手动 ctrl c 退出此 more 实例 因为这更多的是逃离 shell 所以脚本在打开后不知道要运行什么
  • 在 Linux 服务器上创建和编辑 MS-Word 文档?

    希望开发处理文档的服务器端应用程序 源文档大多是MS Word 2003 2007 即MS版本的Docx 希望服务器应用程序能够在linux或windows上运行 想知道在linux下读写MS Word文件最好的工具或库是什么 兼容性是最重
  • SIGHUP 用于重新加载配置

    根据signal 7 SIGHUP用于检测控制终端的挂起或控制进程的死亡 然而 我遇到过很多 OSS 守护进程 服务 其中SIGHUP用于启动配置的重新加载 这里有一些例子 hostapd sshd snort etc 这是实现重新加载的标
  • 从文件中随机采样行

    我有一个大约 40gb 和 1800000 行的 csv 文件 我想随机采样 10 000 行并将它们打印到一个新文件中 现在 我的方法是将 sed 用作 sed n vars lt input txt gt output txt Wher
  • 使用转义序列渲染文本(如终端)

    你好 我正在寻找一些库或工具来在文本文件中呈现带有转义序列字符的文本 我不知道如何称呼它 但这是一个例子 echo e abc vdef abc def echo e abc vdef gt tmp xxxxx vi tmp xxxxx 我
  • sudo pip install python-Levenshtein 失败,错误代码 1

    我正在尝试在 Linux 上安装 python Levenshtein 库 但每当我尝试通过以下方式安装它时 sudo pip install python Levenshtein 我收到此错误 命令 usr bin python c 导入
  • PHP 日志文件颜色

    我正在编写一个 PHP 日志文件类 但我想为写入文件的行添加颜色 我遇到的问题是颜色也会改变终端的颜色 我想要实现的是仅更改写入日志文件的行的颜色 class logClass extends Singleton private funct

随机推荐

  • Qt 主窗口与子窗口之间传值

    1 主函数向子函数传值 主窗口定义信号 子窗口定义槽函数 在主窗口将信号与槽连接起来 mainwindow h include
  • VTK笔记-使用vtkUnstructuredGrid类构建非结构化数据

    非结构化数据 非结构化点 非结构化点是在空间中离散随意分布的点 没有拓扑结构 几何机构也是完全没有规则的 非结构化点由顶点和多点的单元组成 非结构化点是一种简单但很重要的数据集类型 在部分可视化工作中会使用它来表示无结构的数据 非结构化网格
  • Windows Server 2019,开启多用户远程

    Windows Server 2019 开启多用户远程 最后记得重启计算机
  • DevopsCamp 第 2 期作业: 《cobra - 05 Cobra 的子命令》 简单说下 cobra 命令树和 gin 路由树的实现差异

    DevopsCamp 第 2 期作业 cobra 05 Cobra 的子命令 简单说下 cobra 命令树和 gin 路由树的实现差异 原文链接 https typonotes com posts 2023 02 14 devopscamp
  • PCL 体素滤波(C++详细过程版)

    体素滤波 一 概述 二 代码实现 三 结果展示 1 原始点云 2 滤波结果 一 概述 体素滤波PCL中经典的点云下采样算法 具体算法原理和实现代码见 PCL体素滤波器 为充分了解算法实现的每一个细节和有待改进的地方 使用C 代码对算法实现过
  • 力扣题---二叉树---相同的树

    题目连接 相同的树 首先我看题目要求以及例题 给你两棵二叉树的根节点 p 和 q 编写一个函数来检验这两棵树是否相同 如果两个树在结构上相同 并且节点具有相同的值 则认为它们是相同的 示例 1 输入 p 1 2 3 q 1 2 3 输出 t
  • FeignClient接口的几种方式总结

    FeignClient这个注解 已经封装了远程调用协议 在springboot的开发 或者微服务的开发过程中 我们需要跨服务调用 或者调用外部的接口 我们都可以使用FeignClient 一 FeignClient介绍 FeignClien
  • ChatGLM2-6B本地部署

    ChatGLM2 6B本地部署 ChatGLM2 6B 是开源中英双语对话模型 ChatGLM 6B 的第二代版本 在保留了初代模型对话流畅 部署门槛较低等众多优秀特性的基础之上 ChatGLM2 6B 引入了如下新特性 更强大的性能 基于
  • uniapp截取部分区域

    通过canvas来绘制截取部分 然后保存 html部分
  • 手把手教你,Selenium 遇见伪元素该如何处理?

    问题发生 在很多前端页面中 大家会见到很多 before after 元素 比如 百度流量研究院 比如 百度疫情大数据平台 以 百度疫情大数据平台 为例 累计确诊 文本并没有显示在 HTML 源代码中 如果通过常规的 xpath 元素定位方
  • Java 经典面试题:聊一聊 JUC 下的 LinkedBlockingQueue

    本文聊一下 JUC 下的 LinkedBlockingQueue 队列 先说说 LinkedBlockingQueue 队列的特点 然后再从源码的角度聊一聊 LinkedBlockingQueue 的主要实现 LinkedBlockingQ
  • c++中的关联容器

    c 中的关联容器主要是map set 已经multimap multiset 为了讲map 得先将pair类型 pair就是一个两个类型的组合 比如一个人的学号就可以是pair
  • 【重磅最新】163篇ICML-2021强化学习领域论文整理汇总(2021.06.07)

    深度强化学习实验室 官网 http www neurondance com 论坛 http deeprl neurondance com 作者 深度强化学习实验室 来源 整理自https icml cc ICML 是机器学习领域最重要的会议
  • 【python爬虫专项(25)】新型冠状病毒肺炎B站视频弹幕数据爬并做数据词云展示

    1 查看要爬取页面 打开B站网址 输入 新型冠状病毒肺炎 关键字 显示界面如下 2 确定爬虫逻辑 查看网页的内容后 一个网址页面下20个视频 这里只采集20页的视频数据 共400个视频 因为是出现的视频按照点击量进行排序的 所以再往后的视频
  • Java使用多线程异步执行批量更新操作

    写在前面 相信不少开发者在遇到项目对数据进行批量操作的时候 都会有不少的烦恼 尤其是针对数据量极大的情况下 效率问题就直接提上了菜板 因此 开多线程来执行批量任务是十分重要的一种批量操作思路 其实这种思路实现起来也十分简单 就拿批量更新的操
  • 观察者模式(Observer)

    一 观察者模式定义 对象间的一种一对多的依赖关系 当一个对象的状态发生改变时 所有依赖它的对象都得到通知并自动更新 二 观察者模式的结构说明 1 Subject 目标对象 a 一个目标可以被多个观察者观察 b 目标可以提供添加和删除观察者
  • Linux usb gadget框架概述

    大大小小开发了四个与gadget相关的驱动 字符驱动 g multi g ether g zero 在这里把自己对gadget的开发中自己的感悟记录之 想要了解gadget 必须了解其框架 知道composite gadget udc三者之
  • Vue+百度统计 实现网页的PV和UV统计

    目录 什么是PV和UV 百度统计 VUE 验证安装 查看统计 拓展 什么是PV和UV 这里我懒得打字了 直接百度扒过来吧 这个了解知道是啥就行 百度统计 首先你要有个百度账号 自己测试的时候可以用自己的百度个人账户 项目里向公司申请企业商业
  • JAVA byte类型转String类型

    问题 RSA加密 byte类型转String类型 格式转换之后内容变了 解密解不出来 第一种方式 使用 ISO 8859 1 编码 使用此方式编码返回结果会乱码 例如 public static void main String args
  • 超详细Shell学习教程第四篇shell脚本参数化

    目录 1 1参数化实例 1 2参数处理说明 1 3带返回值的参数 书写带参数的shell脚本 1 1参数化实例 创建bash1 sh bin bash echo Shell 传递参数实例 echo 第一个参数为 1 echo 参数个数为 e