bash中函数的调用、变量的定义、函数递归、信号 您所在的位置:网站首页 如何调用shell脚本中的函数类型 bash中函数的调用、变量的定义、函数递归、信号

bash中函数的调用、变量的定义、函数递归、信号

#bash中函数的调用、变量的定义、函数递归、信号| 来源: 网络整理| 查看: 265

一、函数 1.语法

方法1: 函数名() { 函数体 return n }

方法2: function 函数名() { 函数体 return n }

2.调用函数

1)调用函数打印“l like westos”

#!/bin/bash function fun1() { echo "l like westos" } fun1

2)

#!/bin/bash function fun1() { echo "I am a boy~" } count=1 while [ $count -le 5 ] do fun1 count=$[ $count + 1 ] done echo "End of loop" fun1 echo "End of script"

调试 sh -x +函数名

3.引用函数

#每次引用函数时,bash重新回到函数的定义

4.函数不一定要在最开始定义,但是如果函数在定义前就使用就会报错

1)

#!/bin/bash count=1 echo "Before function definition" function fun1() { echo "fun1" } while [ $count -le 5 ] do fun1 count=$[ $count + 1 ] done echo "End of loop" fun2 function fun2() { echo "fun2" }

如果没用定义函数就先使用 会出现报错 2)

#!/bin/bash function fun1() { echo "first fun1" } fun1 function fun1() { echo "second fun1" } fun1 function fun1() { echo "third fun1" } echo "End" 5.函数名必须是唯一的,如果重新定义了函数,新的函数就会覆盖旧的函数 即每次接受的都是最新的值 6.返回值

1)默认退出状态码:默认情况下,函数的状态码时函数最后一条命令返回的退出状态码$? 就算前面的命令出错 只要最后一条命令是对的 函数的退出码就是对的 1)

#!/bin/bash function fun1() { echo "trying to display a non-existent file" ls -l westosfile &> /dev/null } echo "test the function:" fun1 echo "The exit status is : $?"

2)

#!/bin/bash function fun1() { ls -l westosfile &> /dev/null echo "trying to display a non-existent file" } echo "test the function:" fun1 echo "The exit status is : $?"

2)使用return命令 shell使用return命令来退出函数,并返回特定的退出状态

#!/bin/bash function db1() { read -p "Enter a value:" value echo "doubling the value..." return $[ $value * 2 ] } db1 echo "The new value is $?"

返回值在0–255之间 这个的函数值不会保存到shell,即使后面继续写命令也没用

3)使用函数输出 将函数的输出保存在shell变量中,可以获得任何类型的函数输出并将其保存到变量中

4)函数中使用变量 可以向函数中传递参数 函数名会在$0变量中定义,函数命令行上的任何参数都会通过$1,$2定义 $#来判断传给函数的参数项目

#!/bin/bash #-1 $1 + $1 $1 + $2 function addem() { }

5)函数不能直接从命令行获取脚本的参数 1)

#!/bin/bash function fun1() { echo $[ $1 * $2 ] } if [ $# -eq 2 ];then value=`fun1 $1 $2` echo "The result is $value" else echo "Usage:fun1 a b" fi 二、变量的作用域 1)全局变量

任何地方都生效的变量,默认情况下,脚本主体内定义全局变量,函数内可以用,函数外也可以用

#!/bin/bash function db1() { value=$[ $value * 2 ] } read -p "Enter a value:" value db1 echo "The new value is:" $value

(函数外定义 函数内调用)

2)局部变量

定义方法:local value

#!/bin/bash function fun1() { local temp=$[ $value + 5 ] result=$[ $temp * 2 ] } temp=4 value=6 fun1 echo "The result is $result" if [ $temp -gt $value ];then echo "temp is larger" else echo "temp is smaller" fi

(local定义局部变量)

三、函数递归

计算阶乘

#!/bin/bash read -p "请输入数字:"num result=1 for i in `seq $num` do result=$[ $result * $i ] done echo "The result is:" $result

上面是没有使用调用函数的代码,若要使用函数调用,则代码改为:

#!/bin/bash read -p "请输入数字:" num function fun() { result=$[ $result * $i ] } result=1 for i in `seq $num` do fun done echo "The result is:" $result

换种思路

#!/bin/bash function jc() { if [ $1 -eq 1 ];then echo 1 else local temp=$[ $1 - 1 ] local result=`jc $temp` echo $[ $result * $1 ] fi } read -p "Enter a value:" value result=`jc $value` echo "The jc of $value is: $result" 四、信号

signal(前面有讲过) linux通过信号来在运行系统上的进程之间通信 也可以通过信号来控制shell脚本的运行

1)捕捉信号

trap命令 #常用信号 ctrl+c(终止进程) ctrl+z(暂停进程) 阻挡:trap “echo westos” 2 取消:trap:2 查看:stty -a

#列出中断信号与键盘的关系 : stty -a

#信号屏蔽 trap “” 2 #把2信号置空 恢复:trap : 2 恢复方法2:trap - 2 trap “echo -n ‘You are typing ctrl+2’” 2

#!/bin/bash trap "echo 'Sorry!I have trapped Ctrl+C'" 2 echo "This is a test script~" count=1 while [ $count -le 10 ] do echo "Loop #$count" sleep 2 count=$[ $count + 1 ] done echo "This is the end of the script~" trap - 2 echo "I just removed the trap"

2)捕捉脚本的退出

#!/bin/bash trap "echo ByeBye~" EXIT count=1 while [ $count -le 5 ] do echo "Loop #$count" sleep 2 count=$[ $count + 1 ] done

xargs 获取前面命令的执行结果 -exec

cat test | xargs

按ctrl+c 删除文件westos touch /tmp/westos_$(date +%F-%N)

练习: 先使用一个虚拟机当作跳板 使用被自动连接的两个虚拟机配钥匙,把钥匙分发给跳板机 使用另外一台测试机ssh跳板机 如果不是超级用户 给一个菜单:1)172.25.254.100 2)172.25.254.200 3)exit 查看uid是否为0 是0就是超级用户 定义一个屏蔽函数 先建立父进程:

cd /etc/profile.d vim fu.sh [ $UID -ne 0 ] && sh /mnt/tiaoban.sh

再建立子进程:

cd /mnt vim tiaoban.sh #!/bin/bash function trapper() { trap "" INT EXIT TSTP TERM HUP } function main() { while true do trapper clear read -p "请选择下列信息: 1)172.25.250.218 2)172.25.254.18 3)exit " num case $num in 1) echo "log in 172.25.254.218..." ssh [email protected] ;; 2) echo "log in 172.25.254.18..." ssh [email protected] ;; 3) exit ;; esac done } main


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有