高级shell 脚本
1.函数
函数是一个脚本代码块,你可以为其命名并在代码中任何位置重用。要在脚本中使用该代码块时,只要使用所起的函数名就行了(这个过程称为调用函数)。本节将会介绍如何在shell脚本中创建和使用函数
创建函数
function name {
commands
}
name() {
commands
}
使用函数
[root@localhost advanced_shell_script]# cat test1.sh
#!/bin/bash
#using a function in a script function func1 { echo "This is an example of a function" } count= while [ $count -le ] ;do
func1
count=$[ $count + ]
done echo "This is the end of the loop"
func1
echo "This is script end" [root@localhost advanced_shell_script]# ./test1.sh
This is an example of a function
This is an example of a function
This is an example of a function
This is the end of the loop
This is an example of a function
This is script end
[root@localhost advanced_shell_script]#
使用return 返回 函数
[root@localhost advanced_shell_script]# cat test2.sh
#!/bin/bash #using the return command in a function function db1 {
read -p "Enter a value:" value
echo "doubling the value"
return $[ $value * ] }
db1
echo "The new value $?" [root@localhost advanced_shell_script]# ./test2.sh
Enter a value:
doubling the value
The new value 4
[root@localhost advanced_shell_script]# ./test2.sh #注意$? 返回函数值必须小于256 ,因此需要另外一种方法
Enter a value:200
doubling the value
The new value 144
[root@localhost advanced_shell_script]#
另外一种方法
[root@localhost advanced_shell_script]# cat test3.sh
#!/bin/bash #using the return command in a function function db1 {
read -p "Enter a value:" value
#echo "doubling the value"
echo $[ $value * 2 ] #新函数会用echo语句来显示计算的结果。该脚本会获取dbl函数的输出,而不是查看退出状态码
}
value1=$(db1)
echo "The new value $value1" [root@localhost advanced_shell_script]# ./test3.sh
Enter a value:
The new value
[root@localhost advanced_shell_script]#
传递参数:
[root@localhost advanced_shell_script]# cat test4.sh
#!/bin/bash
#passing parameters to a function function addem {
if [ $# -eq ] || [ $# -gt ];then
echo -
elif [ $# -eq ];then
echo $[ $ * $ ]
else
echo $[ $ + $ ] fi
}
echo -n "Adding 20 and 30:"
value=$(addem )
echo $value echo -n "30 *:"
value=$( addem )
echo $value echo -n "10 20 30:"
value=$(addem )
echo $value [root@localhost advanced_shell_script]# ./test4.sh
Adding and :
*:
:-
[root@localhost advanced_shell_script]#
命令行传递参数
[root@localhost advanced_shell_script]# cat test5.sh
#/bin/bash
#trying to access script parameters inside a function function func1 {
echo $[ $ * $ ] } if [ $# -eq ];then value=$(func1 $ $)
echo "The result is $value"
else
echo "Usage:badtest1 a b"
fi
[root@localhost advanced_shell_script]# ./test5.sh
Usage:badtest1 a b
[root@localhost advanced_shell_script]# ./test5.sh
The result is
[root@localhost advanced_shell_script]#
在函数中处理变量
全局变量和局部变量
. 全局变量
全局变量是在shell脚本中任何地方都有效的变量。如果你在脚本的主体部分定义了一个全局变量,那么可以在函数内读取它的值。类似地,如果你在函数内定义了一个全局变量,可以在脚本的主体部分读取它的值。
. 局部变量
无需在函数中使用全局变量,函数内部使用的任何变量都可以被声明成局部变量。要实现这一点,只要在变量声明的前面加上local关键字就可以了。
[root@localhost advanced_shell_script]# cat test6.sh
#!/bin/bash
#demonstrating the local keyword
function func1 { local test1=$[ $test2 * 2 ] test3=$[ test2 * ] }
test3=
test1=
test2=
func1
echo "$test1 $test2 $test3 " [root@localhost advanced_shell_script]# vim test6.sh
[root@localhost advanced_shell_script]# ./test6.sh #局部变量的值 test1 在函数执行后没有被修改,test3 的值在函数执行后,被修改为函数执行的结果
1223340 5 10
[root@localhost advanced_shell_script]#
向函数传递数组变量的注意事项
[root@localhost advanced_shell_script]# cat test8.sh
#!/bin/bash
# array variable to function test
function test1 { #在向函数传递数组变量的时候,需要将数据变量当做一个整体进行传递,通过$@ 方式
#$@ 将给定的多个参数定义为同一字符串的多个单独的单词,类似 "A" "B" "C"
local newarray
newarray=($(echo $@))
echo "The new array value is: ${newarray[*]}"
}
function test2 { #在向函数传递数组变量时,如果使用 $1 参数,会识别为数组变量的第一个参数。无法完整的传递整个参数。默认不会将传递给函数的数组变量看成一个参数
local newarray
newarray=$
echo "The test2 function valueis: ${newarray[*]}" } myarray=( )
echo "The original array is ${myarray[*]}"
test1 ${myarray[*]}
test2 ${myarray[*]} [root@localhost advanced_shell_script]# ./test8.sh
The original array is
The new array value is:
The test2 function valueis:
[root@localhost advanced_shell_script]#
函数递归的使用,使用bash -x 跟踪递归的处理步骤很有效
root@localhost advanced_shell_script]# cat test11.sh
#!/bin/bash
#using recursion function factorial { if [ $ -eq ];then echo
else
local temp=$[ $ - ]
local result=`factorial $temp`
#return $
echo $[ $result * $ ]
fi
} value=
result=$(factorial $value)
echo "$result"
[root@localhost advanced_shell_script]# bash -x test11.sh
+ value=
++ factorial
++ '[' -eq ']'
++ local temp=
+++ factorial
+++ '[' -eq ']'
+++ local temp=
++++ factorial
++++ '[' -eq ']'
++++ local temp=
+++++ factorial
+++++ '[' -eq ']'
+++++ local temp=
++++++ factorial
++++++ '[' -eq ']'
++++++ echo
+++++ local result=
+++++ echo
++++ local result=
++++ echo
+++ local result=
+++ echo
++ local result=
++ echo
+ result=
+ echo [root@localhost advanced_shell_script]#
创建库的办法
[root@localhost advanced_shell_script]# cat myfuncs #创建的库文件需要有执行权限
#my script functions function addem { echo $[ $ + $ ] } function multem { echo $[ $ * $ ]
} function divem { if [ $ -ne ];then echo $[ $ / $ ] else
echo
fi
} [root@localhost advanced_shell_script]# cat test12.sh
#!/bin/bash
# using functions defined in a library file
source ./myfuncs #两种方式调用库文件 ,source 和 .. ,这是让库文件在当前shell 调用。如果使用 ./mufuncs 相当于在子shell 调用了。会找不到命令
# ../myfuncs
value1=
value2=
result1=$(addem $value1 $value2)
result2=$(multem $value1 $value2)
result3=$(divem $value1 $value2)
echo "The result of adding them is: $result1"
echo "The result of multiplying them is: $result2"
echo "The result of dividing them is: $result3"
#
[root@localhost advanced_shell_script]# ./test12.sh
The result of adding them is:
The result of multiplying them is:
The result of dividing them is:
[root@localhost advanced_shell_script]#
在命令行创建函数:
[root@localhost advanced_shell_script]# function funcs { #当在命令行上定义函数时,你必须记得在每个命令后面加个分号,这样shell就能知道在哪里是命令的起止了
> echo $[ $ + $ ];}
[root@localhost advanced_shell_script]# funcs [root@localhost advanced_shell_script]#
在 .bashrc 中定义函数
[root@localhost ~]# cat /root/.bashrc # .bashrc 是函数的最佳定义位置
# .bashrc # User specific aliases and functions alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i' # Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi function add {
echo $[ $ + $ ] }
[root@localhost ~]#
在script 中使用在.bashrc 中定义的函数
root@localhost advanced_shell_script]# cat test13.sh
#!/bin/bash source /root/.bashrc #通过source 命令将函数调用进来,否则命令找不到 result=$(add )
echo "$result" [root@localhost advanced_shell_script]#
高级shell 脚本的更多相关文章
- Linux&shell之高级Shell脚本编程-创建函数
写在前面:案例.常用.归类.解释说明.(By Jim) 使用函数 #!/bin/bash # testing the script function myfun { echo "This i ...
- 《Linux命令行与shell脚本编程大全 第3版》高级Shell脚本编程---47
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:
- Linux&shell之高级Shell脚本编程-创建菜单
写在前面:案例.常用.归类.解释说明.(By Jim) 创建菜单#!/bin/bash# testing the scriptclearechoecho -e "\t\t\tSys Admi ...
- 《Linux命令行与shell脚本编程大全 第3版》
第一部分 Linux 命令行 第1章 初识Linux she1.1 什么是Linux 21.1.1 深入探究Linux 内核 31.1.2 GNU 工具 61.1.3 Linux 桌面环境 81 ...
- shell脚本-高级变量
shell脚本-高级变量 字符串变量切片 ${#var}: 返回字符串变量var的长度 ${var:offset}: 返回字符串变量var中从第offset个字符后(不包括第offset 个字符)的字 ...
- 一、Shell脚本高级编程实战第一部
Shell脚本语言是实现linux系统自动化管理的重要且必要的工具,几乎每一个合格的linux系统管理员或者高级运维工程师都要熟练shell脚本语言的编写,只有这样才能提升工作效率,解决工作中的重复劳 ...
- Linux Shell 高级编程技巧4----几个常用的shell脚本例子
4.几个常用的shell脚本例子 4.0.在写脚本(同样适用在编程的时候),最好写好完善的注释 4.1.kill_processes.sh(一个杀死进程的脚本) #!/bin/bash c ...
- 四、Shell脚本高级编程实战第四部
一.比较两个数的大小 #!/bin/shread -p "Pls input two num:" a b[ -z "$a" ] || [ -z "$b ...
- 三、Shell脚本高级编程实战第三部
保养好自己的发动机:身体的和心里的身体健康:打打球,跑跑步心里健康:多和大家接触,保持家人.朋友的良好关系一.$*和$@的区别 $*:获取shell的所有参数,将所有的参数视为单个字符串. $ ...
随机推荐
- docker container 互联
创建一个 network docker network create test-network 创建rocketmq docker run -d -p 9876:9876 -p 10909:1090 ...
- MYSQL定时任务 触发器
流程: 查看时间调度器是否开启,OFF关闭,ON开启 SHOW VARIABLES LIKE 'event_scheduler' 设置开启 set GLOBAL event_scheduler = 1 ...
- 解决vue webApp使用lib-flexible和px2rem引用第三方ui库后,样式变小问题
首先,需要卸载项目中的postcss-px2rem. npm uninstall postcss-px2rem --save-dev 其次,安装postcss-px2rem-exclude npm i ...
- hive高级数据类型
hive的高级数据类型主要包括:数组类型.map类型.结构体类型.集合类型,以下将分别详细介绍. 1)数组类型 array_type:array<data_type> -- 建表语句 cr ...
- 关于反射和JVM的整理
- [dev][socket] unix domain socket删除socket文件
问题 在使用unix domain socket的时候,bind之后,会在本地路径里 产生一个与path对应的socket文件. 如何正确的在用完socket之后,对其销毁呢? 方案 使用 unlin ...
- Enterprise Architect
Enterprise Architect 是一款计算机辅助软件工程,这款软件用于设计和构建软件系统.业务流程建模及更多通用的建模.EA不同于普通的UML画图工具(如VISIO),它将支撑系统开发的全过 ...
- Delphi 的内存操作函数(2): 给数组指针分配内存
静态数组, 在声明时就分配好内存了, 譬如: var arr1: ..] of Char; arr2: ..] of Integer; begin ShowMessageFmt('数组大小 ...
- Redis集群概述
Redis Cluster与Redis3.0.0同时发布,以此结束了Redis无官方集群方案的时代,目前,Redis已经发布了3.0.7版本. redis cluster是去中心化,去中间件的,也就是 ...
- matlab2014a 转化c语言
一.原因错误 第一种,命令窗口测试代码mbulid -setup 出错 , 就是电脑没有安装sdk7.1 网上有很多安装教程(注意要有vc++2010要卸载,具体看网上教程,安装好了要更性vc++ ...