Shell脚本通过参数传递调用指定函数

我们在写一些功能性脚本的时候,往往会把操作相似或者参数类似行为接近的函数放在同一个shell脚本中,这样管理方便,维护简单,也很清晰。对于这种情况,通常的办法是,在shell脚本中定义所有用到的函数,然后在正文代码中用case语句读入输入的命令函数参数来调用指定的相应函数。这样就达到一个shell脚本使用的强大功能。

下面以一个简单的例子来说明。一个计算器提供了加减乘除的功能:

#!/bin/bash
usage="Usage: `basename $0` (add|sub|mul|div|all) parameter1 parameter2"
command=$1
first=$2
second=$3
function add() {
        ans=$(($first + $second))
        echo $ans
}
function sub() {
        ans=$(($first - $second))
        echo $ans
}
function mul() {
        ans=$(($first * $second))
        echo $ans
}
function div() {
        ans=$(($first / $second))
        echo $ans
}
case $command in
  (add)
     add
     ;;
  (sub)
     sub
     ;;
  (mul)
     mul
     ;;
  (div)
     div
     ;;
  (all)
     add
     sub
     mul
     div
     ;;
  (*)
     echo "Error command"
     echo "$usage"
     ;;
esac

上面的这段shell脚本,我们就可以通过传入不同的参数调用达到不同的目的。

[[email protected]]$ ./calculator add 2 3
5
[[email protected]]$ ./calculator sub 2 3
-1
[[email protected]]$ ./calculator mul 2 3
6
[[email protected]]$ ./calculator div 2 3
0
[[email protected]]$ ./calculator all 2 3
5
-1
6
0
[[email protected]]$ ./calculator a 2 3
Error command
Usage: calculator (add|sub|mul|div|all) parameter1 parameter2

倘若我们不想每个函数都用同样个数的参数,也就是不同的函数参数不一样时候怎么办?这时候我们可以在函数体的内部读入参数,然后在case后的相应调用语句时候也传入相应的参数。

function double() {
        ans=$(($1 + $1))
        echo $ans
}
case $command in
  (dou)
     double "$first"   #you can also use "$2"
     ;;

当我们需要将command之后的参数原封不动传给调用函数,而却又要忽略command参数,这时候我们可以在调用前使用一次shift命令。shift命令实现将参数左移一位,这样原来的第一个参数就消失了。

如果要将剩下的参数原封不动地传给函数,可以使用参数$*;如果将剩下的参数组成一个命令字符串传给函数,则使用参数"$*"。区别就是是否用引号,有引号时候实际只传了一个参数过去,它是当前shell中shift之后加载的参数的组合,没有引号就是剩下的参数了。

时间: 2024-10-15 16:57:52

Shell脚本通过参数传递调用指定函数的相关文章

shell脚本第二篇——将指定目录下大于200K的文件移动到/tmp下

shell脚本第二篇--将指定目录下大于200K的文件移动到/tmp下 # vim  /tmp/files.sh #!/bin/bash #将指定目录下大于200K的文件移动到/tmp下 read  -p  "请输入您要将目录下大于200K文件移动的目录路径:" $1 for FILE in `ls  $1` do if [ -f  $FILE ] ; then if [ `ls -l $FILE | awk `{print $5}` -gt 204800 ] ; then mv  $

shell脚本之间互相调用

在Shell中要如何调用别的shell脚本,或别的脚本中的变量,函数呢? 方法一: . ./subscript.sh 方法二: source ./subscript.sh 注意: 1.两个点之间,有空格,千万注意. 2.两个脚本不在同一目录,要用绝对路径 3.为简单起见,通常用第一种方法 例如: 复制代码 代码如下: main.sh #主脚本 subscripts.sh #子脚本,或者说被调脚本 [code] [code] ###subscripts.sh 脚本内容如下:### #!/bin/b

Linux学习-高级shell脚本编程(一)函数

引文: 通常编写shell脚本时,你会发现很多地方都要用到相同的代码或者说是相同的功能.如果是一段小代码,那无所谓.可如果多次使用而且还是相同的代码,我想你也会感觉很烦的.为了能够让代码重用,这就使用到函数了. 温馨提示 变量赋值的格式为: 变量名=变量值 注意事项: 变量名前面不应加美元"$"符号.(和PHP不同)等号"=" 前后不可以有空格.和C语言不同,Shell中不需要显式的语法来声明变量. 变量名不可以直接和其他字符相连,如果想相连,必须用括号:echo

利用Type.InvokeMember调用指定函数

需求:利用反射实现父模块根据参数动态调用三个子模块. /// <summary> /// 加载子模块 /// </summary> /// <param name="assemblyName">子模块程序集名称</param> /// <param name="className">要调用的指定函数所在的程序集函数名</param> private void Load(string assemb

Linux下shell脚本中信号捕获和函数练习脚本之ping一个网段

该脚本主要的目的是练习在Linux bash脚本中捕获信号,顺便练习一下函数的使用,还有就是终止一个正在运行的程序后,该程序打开的文件的后续处理问题等等! 脚本功能: ping一个网段内的IP,检测哪些IP在线,哪些IP不在线 练习的命令: 1.mktemp 用法:#mktemp 1117.www.qixoo.qixoo.com/Path/To/SomeFile.XXX 其中XXX可以为多个,是由系统随机生成的一段字符串 -d  创建为目录 2.ping 测试网络是否通畅 用法:#ping [-

利用shell脚本去备份所指定的数据库

#! /bin/bash logintool=/home/yx/server/mysql/mysql/bin/mysql dumptool=/home/yx/server/mysql/mysql/bin/mysqldump username=root passwd=`cat /home/yx/stt/shellmysql/dumpsql/.passwd` socketfile=/var/run/mysqld/mysqld.sock storepath=/home/yx/backup/hnf_fi

JAVA调用Shell脚本

在实际项目中,Java有时候需要调用C写出来的东西,除了JNI以外,我认为一种比较好的方法是JAVA调用Shell.先把C写出来的make成可执行文件,然后再写一个shell脚本执行该可执行文件,最后是JAVA调用该shell脚本. JAVA调用很简单,例子如下: 首先是shell脚本 [plain] view plain copy print? #!/bin/sh echo Begin word cluster /home/felven/word2vec/word2vec -train /ho

Shell脚本编程概述(三):函数和数组

一.函数:function 1.function概念 function是一种过程式编程,目的在于代码重用,是一种模块化编程.结构化编程编程方式 函数:把一段独立功能的代码当作一个整体,并为之一个名字:命名的代码段 注意: 1) 定义函数的代码段不会自动执行,在调用时执行:所谓调用函数,在代码中给定函数名即可: 2) 函数名出现的任何位置,在代码执行时,都会被自动替换为函数代码: 2.语法 语法一: function  FUNCTION_NAME  { ...函数体... } 语法二: FUNCT

Shell脚本中调用另外一个脚本的方法

在Linux平台上开发,经常会在console(控制台)上执行另外一个脚本文件,经常用的方法有:./my.sh 或 source my.sh 或 . my.sh:这三种方法有什么不同呢?我们先来了解一下在一个shell脚本中如何调用另外一个shell脚本,其方法有 fork    exec    source. 1.fork  ( /directory/script.sh) : 如果shell中包含执行命令,那么子命令并不影响父级的命令,在子命令执行完后再执行父级命令.子级的环境变量不会影响到父