Shell函数和脚本参数

2023-11-17

1.在脚本中定义函数

functin_name(){   //直接的定义方式
语句块
}

function function_name(){  //使用关键字 function 定义的方式
语句块
}

函数命名规则:

  1. 为了和变量区分,使用小写字母和下划线,以字母开头
  2. 不能使用命令作为函数名
  3. 不能使用特殊符号
  4. 函数名尽力体现功能

2.在脚本中使用函数

在脚本中使用函数名直接调用函数

#! /bin/bash
#this is a  example
#2017/5/12

function hello(){ //使用关键字function
echo "Now is the function hello."
echo "Hello~"
}

hi(){  //不适用关键字function
echo "Now is the function hi."
echo "Hi~"
}

//脚本主体部分,调用定义的函数
echo "Now call the function hello."
hello  //调用函数hello

echo "Now call the function hi."
hi  //调用函数hi

3.向函数传递参数和返回值
脚本的位置变量:http://blog.csdn.net/wee_mita/article/details/71171849

在函数中获取参数可以像脚本获取参数那样,获取位置变量

#!/bin/bash
#this is a example
#2017/5/12

function A(){   //定义函数A
echo 'expr $1 + $2'   //第一第二个位置参数
}

D= 'A 100 300'      //定义变量D,并且调用函数A,其中100 300  为函数A的第一第二个位置变量
if [ $? = 0 ]      //脚本预定义的变量,判断上一条命令是否执行成功,成功返回0,否则非0,通常为1

    then
    echo "D=$D"            //只返回一个D的值
    echo  "D="$D        //通过变量可以返回多个函数值
else
    echo "Function A fails."
fi

4.返回函数执行状态

在脚本中调用函数后,函数会执行函数结构体中的语句,完成后系统会根据函数中的最后一个语句的执行状态,自动返回函数的执行状态信息,但是有时候函数中关键的语句不是最后一句,这时候就需要使用return语句

return语句:

  1. return:将函数最后一条命令的执行状态作为其状态信息返回
  2. return 0:返回函数成功执行的信息
  3. return 1:返回函数错误的信息

5.使用函数文件调用

需要编写一个较为庞大的脚本时,可能会涉及许多的函数、变量,通常将重众多的函数和变量放在一个单独的脚本文件中

#!/bin/bash
#This is a function definition script
#2017/5/12
#The name of the script is function.example

function hello(){ 
echo "Now is the function hello."
echo "Hello~"
return //将函数最后一条命令的执行状态作为其状态信息返回
}

hi(){  
echo "Now is the function hi."
echo "Hi~"
return //将函数最后一条命令的执行状态作为其状态信息返回
}

调用已经编写好的函数文件:

  • 将函数文件包含在脚本文件中,然后直接进行调用
  • 像变量一样在命令行提示符下使用(在命令行提示符中调用函数文件后,就可以直接调用函数)
#!/bin/bash
#this is a example script
#2017/5/12

../function.example //函数文件的路径应该与脚本文件的路径相同,否则需要输入函数文件的绝对路径或相对路径

echo "Now call the functon hello."
hello John  //调用时传递参数
//在命令行提示符中调用函数

../function.example
hi Alix 

Now is the function hi.     //这是输出
Hi~Alix                    //这是输出

可以将函数文件写入环境变量中,然后像使用命令一样调用自定义的函数,以实现较复杂的功能

6.像脚本传递参数

通常通过位置变量来传递参数,但是位置变量的最大个数为9,如何传递超过9个变量呢,一般采用shift命令

shift命令的用法比较特殊,它没有选项和参数,直接运行命令即可。运行shift命令时,位置变量就像一个可以移动的“指针”,每执行一次,位置变量指向的参数将会向移动一位

即使用shift命令后,位置变量 1使 2的值,以此类推。随着shift命令的使用,位置变量$1的值会不断变化,直到移动到最后一个参数之后

Shift命令的作用是将所有的位置变量应用的参数往后移动一位

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

Shell函数和脚本参数 的相关文章

  • Amazon EC2 - Apache 服务器重启问题

    当我运行这个命令时 sudo etc init d httpd restart 它给出以下错误 停止 httpd 失败 启动 httpd 98 地址已在使用中 make sock 无法绑定到地址 80 98 地址已在使用 make sock
  • 在 UNIX 时间戳 Shell/Bash 中将日期与时区转换

    我需要将日期从格式为 yyyy mm dd hh mm ss TZ 的字符串转换为 UNIX 时间 TZ 时区 到目前为止我所做的是将没有时区的 yyyy mm dd hh mm ss 格式的日期转换为时间戳 dateYMD 2019 2
  • 使用请求和多处理时的奇怪问题

    请检查这个Python代码 usr bin env python import requests import multiprocessing from time import sleep time from requests import
  • 使用多线程的套接字服务器或文件服务器实现:概念不清楚

    请帮我理清这个概念 假设我们有一个使用线程实现的套接字端口服务器 套接字服务器侦听套接字端口 并在消息到达时创建一个线程来服务该请求 客户端代码向服务器发送给定数量的消息 该客户端代码也可以由多个用户在不同的计算机上运行 我知道客户端代码作
  • 什么是接口标识符

    我有一台笔记本电脑 使用一个或多个网络适配器连接到我组织的网络 我正在尝试编写一个工具来持续监控每个网络的连接状态和连接质量 然而 我的网络知识有限 术语让我感到困惑 特别是查找所有网络适配器 有人建议我使用命令ifconfig它给了我所谓
  • Linux 源代码中的哪个位置会识别特定的 USB 设备?

    我有一个特定的 USB 设备 我想检查其 Linux 驱动程序源代码 我的理解是 USB 驱动程序执行的第一步是注册自己能够处理具有特定供应商 ID 和产品 ID 的设备 就我而言 供应商 ID 是0BDA产品 ID 是8187 有了这些信
  • 每当调用 malloc/free 时输出到 stderr

    使用 Linux GCC C 每当调用 malloc free new delete 时 我想向 stderr 记录一些内容 我试图了解库的内存分配 因此我想在运行单元测试时生成此输出 我使用 valgrind 进行内存泄漏检测 但我找不到
  • 在命令行上解密使用 PHP openssl_encrypt 制作的文件

    我有一个要加密的字符串 encryptThis Super Secret Text echo openssl encrypt encryptThis aes 128 cbc 1234 FALSE F68A9A229A516752 然后我通过
  • 模拟用户输入以使用不同参数多次调用脚本

    我必须使用提供的脚本 该脚本在脚本运行时接受用户输入而不是参数 我无法解决这个问题 脚本的一个例子是 bin bash echo param one read one doSomething echo param two read two
  • 从汇编程序获取命令行参数

    通读 专业汇编语言书籍 似乎它提供了用于读取命令行参数的错误代码 我纠正了一点 现在它从段错误变成了读取参数计数 然后是段错误 这是完整的代码 data output1 asciz There are d params n output2
  • 使用与后期步骤中的 Shell 脚本中的克隆相同的 http git 凭据

    我想要自动化我们的发布过程 并且我有一个 Maven 项目的以下 Jenkins 构建作业 使用配置的 Jenkins 凭证 用户名 密码 克隆 Git 存储库 执行一些 Maven 命令以进行构建 配置一个后步骤来执行一些额外的 Git
  • 尝试 SSH 时设备的 ioctl 不合适

    我正在尝试通过 SSH 连接几台服务器并尝试获取sudo l每个服务器的输出 下面是我正在执行的脚本 bin bash serverlist tmp servers while IFS read r server netgroup user
  • 命令行参数中的“-”(破折号)有什么魔力?

    例子 创建 ISO 映像并将其直接刻录到 CD mkisofs V Photos r home vivek photos cdrecord v dev dev dvdrw 更改到上一个目录 cd 侦听端口 12345 并解压发送到该端口的数
  • 在 Linux 2.6.21 (glibc 2.3.5) 上进行 ARP 和反向 ARP

    我需要在任意 IP 网络上存储对第三方设备的持久引用 其中设备的 IP 地址可能是静态的或由 DHCP 随机分配 我不控制网络上的设备 也不能依赖 DNS 和其他现有的或与设备一起使用的临时网络协议 所以我被指示使用硬件地址和 ARP 进行
  • Openshift 上的自定义 Node.js 版本

    我在运行自定义节点版本时遇到问题node0 10您可以在开放班次中找到墨盒here https github com DavidReinberger openshift meteor leaderboard customNode 我可以很好
  • 寻找下一个开放端口

    有没有什么办法 使用基本的 Unix 命令 找到下一个未使用的端口号 从端口 4444 开始向上 我通过 ssh 通过 openssh 进入 Windows XP 计算机 运行 Cygwin 工具并使用 bash shell 谢谢 戴夫 尝
  • 如何获取与文件类型关联的图标路径和索引?

    给定一个文件类型 例如 txt 我怎样才能得到 path index 文件类型的关联图标路径和索引 例如 我想转换 txt into Path SystemRoot system32 imageres dll Index 102 有了这些信
  • 在 C 中使用 sqrtf():“未定义对‘sqrtf’的引用”

    我正在使用Linux Ubuntu 12 04 https en wikipedia org wiki Ubuntu version history Ubuntu 12 04 LTS 28Precise Pangolin 29 Precis
  • Linux shell 命令逐块读取/打印文件

    是否有一个标准的 Linux 命令可以用来逐块读取文件 例如 我有一个大小为 6kB 的文件 我想读取 打印第一个 1kB 然后是第二个 1kB 看来猫 头 尾在这种情况下不起作用 非常感谢 你可以这样做read n在循环中 while r
  • 如何从脚本向 sudo 提供密码?

    请注意 这是在我的本地计算机上运行的来宾虚拟机 VBox 我不担心安全性 我正在编写一个将在 Linux Ubuntu VM 上执行的脚本myuser用户 该脚本将在下面创建一个非常大的目录树 etc myapp 目前我必须手动完成所有这些

随机推荐