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函数和脚本参数 的相关文章

  • 通过 Visual Studio 2017 使用远程调试时 Linux 控制台输出在哪里?

    我的Visual Studio 2017 VS2017 成功连接Linux系统 代码如下 include
  • 检查帐号是否为数字时出现语法错误

    if account nr 0 9 from account nr 0 9 这是为了检查帐号是否为数字 我收到语法错误 这个问题的早期版本缺少之间的空格if and 实际代码具有所需的空间 它显示以下错误消息 syntax error ac
  • 就分页分段内存而言的程序寿命

    我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念 如果有人能澄清从开始到结束所涉及的所有步骤 我们将很高兴 x86 使用分页分段内存技术进行内存管理 任何人都可以解释一下从可执行的 elf 格式文件从硬盘加载到主内存到它
  • 如何在 Ubuntu 中创建公共 HTML 文件夹?

    简单的问题 但由于某种原因我无法在谷歌上找到确切的答案 我在 Slicehost 上安装了全新的 Ubuntu 并且想在我的主目录中为包含一堆静态 HTML 文件的简单网站创建一个公共目录 我该怎么做呢 只是打字的问题吗mkdir publ
  • 从 ttyUSB0 写入和读取,无法得到响应

    我对 Linux tty 不太有经验 我的环境是带有丰富 USB 串行的 Raspbian 什么有效 stty F dev ttyUSB0 38400 cu l dev ttyUSB0 s 38400 cu to dev ttyUSB0作品
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • 如何正确使用fork、exec、wait

    我正在编写的 shell 需要执行用户提供给它的程序 这是我的程序的非常简短的简化版本 int main pid t pid getpid this is the parents pid char user input NULL size
  • 如何设置 tmux 在启动时打开指定的窗口?

    如何设置 tmux 使其在启动时打开指定的窗口 您可以编写一个小 shell 脚本来启动 tmux 以及所需的程序 我在一个名为 dev tmux 的 shell 脚本中包含以下内容 开发环境 bin sh tmux new session
  • 内核的panic()函数是否完全冻结所有其他进程?

    我想确认内核的panic 功能和其他类似kernel halt and machine halt 一旦触发 保证机器完全冻结 那么 所有的内核和用户进程都被冻结了吗 是panic 可以被调度程序中断吗 中断处理程序仍然可以执行吗 用例 如果
  • 与 pthread 的进程间互斥

    我想使用一个互斥体 它将用于同步对两个不同进程共享的内存中驻留的某些变量的访问 我怎样才能做到这一点 执行该操作的代码示例将非常感激 以下示例演示了 Pthread 进程间互斥体的创建 使用和销毁 将示例推广到多个进程作为读者的练习 inc
  • 在 AIX 中使用 Mailx 通过电子邮件发送 SQLPlus 查询结果的 Shell 脚本

    我有我需要的命令 如果我在提示符下执行这些命令 一切都会按预期进行 SQLPlus 运行查询 将结果导出到文件 然后 Mailx 将该文件通过电子邮件发送给我 sqlplus username pwd instance SPOOL home
  • 如何查找哪个 Yocto 项目配方填充图像根文件系统上的特定文件

    我经常与 Yocto 项目合作 一个常见的挑战是确定文件为何 或来自什么配方 包含在 rootfs 中 这有望从构建系统的环境 日志和元数据中得出 理想情况下 一组命令将允许将文件链接回源 即配方 我通常的策略是对元数据执行搜索 例如gre
  • 如何在 *nix 中登录时运行脚本?

    我知道我曾经知道如何做到这一点 但是 如何在 unix 中登录时运行脚本 bash 可以 From 维基百科 Bash http en wikipedia org wiki Bash 28Unix shell 29 当 Bash 启动时 它
  • Linux 为一组进程保留一个处理器(动态)

    有没有办法将处理器排除在正常调度之外 也就是说 使用sched setaffinity我可以指示线程应该在哪个处理器上运行 但我正在寻找相反的情况 也就是说 我想从正常调度中排除给定的处理器 以便只有已明确调度的进程才能在那里运行 我还知道
  • linux下如何从文本文件中获取值

    我有一些文本格式的文件 xxx conf 我在这个文件中有一些文本 disablelog 1 当我使用 grep r disablelog oscam conf 输出是 disablelog 1 但我只需要值1 请问你有什么想法吗 一种方法
  • Jenkins:如何在 Windows 从机中执行 shell 脚本

    我有一个 Windows 从机 安装了 bash 我正在尝试在其上运行 shell 脚本作为预构建步骤 关于我如何做到这一点有什么想法吗 您需要使用脚本作为参数来运行 bash bash yourscript
  • Apache 访问 Linux 中的 NTFS 链接文件夹

    在 Debian jessie 中使用 Apache2 PHP 当我想在 Apache 的文档文件夹 var www 中创建一个新的小节时 我只需创建一个指向我的 php 文件所在的外部文件夹的链接 然后只需更改该文件夹的所有者和权限文件夹
  • 这种文件锁定方法可以接受吗?

    我们有 10 个 Linux 机器 每周必须运行 100 个不同的任务 这些计算机主要在我们晚上在家时执行这些任务 我的一位同事正在开发一个项目 通过使用 Python 自动启动任务来优化运行时间 他的程序将读取任务列表 抓取一个打开的任务
  • 如何检查主机是否在您的known_host ssh中

    我的脚本中使用以下命令 将主机添加到 ssh 中的已知主机 VAR2 expect c spawn ssh o StrictHostKeyChecking no REMOTE HOST USER REMOTE HOST IP expect
  • ansible unarchive 模块如何查找 tar 二进制文件?

    我正在尝试执行一个 ansible 剧本 该剧本的任务是利用unarchive模块 因为我是在 OSX 上执行此操作 所以我需要使用它gnu tar 而不是bsd tar通常与 OSX 一起提供 因为BSD tar 不受官方支持 https

随机推荐