高级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的所有参数,将所有的参数视为单个字符串. $ ...
随机推荐
- ARM_DMA学习
AMBA: advanced(高级) microcontroller bus architecture; 利用多层总线系统减少DMA传输和CPU中断的延迟: DMA流或DMA通道,流优先级,Adres ...
- c语言二级指针内存模型
第一种: 指针数组作为输入参数 char *myArray[] = {"aaaaaa", "ccccc", "bbbbbb", " ...
- A计划 HDU - 2102
A计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- RobotFramework环境配置:默认以管理员权限运行cmd
设置cmd以管理员权限运行 目的:创建或删除文件等命令时,需要管理员权限运行cmd(linux以root用户登录). 例如,创建日志目录. 方法一: 1.激活administrator用户 2 ...
- 自动化脚本测试,postman使用沉淀
// 服务器地址 var server = 'XXXXXXXXXXXX'; //秘钥Key var secretKey = 'XXXXXXXXXXXX'; //获取当前时间 function crea ...
- Android创建列表并为列表添加数据
在Android开发中经常会用到ListView,也就是列表,而列表的内容需要如何决定呢,很好的方法是使用各种adapter 首先来看看用entries添加列表内容 在布局文件中,创建一个ListVi ...
- tomcat部署公共jar包
如果每次打war包都要把所有依赖jar放在WEB-INF/lib下,是很傻的做法,war包很大,也浪费内存.参考之前jboss上部署公共jar的经验,tomcat实现起来想来也不困难. 1. 参照ma ...
- mysql 的mgr集群
mysql 的mgr集群 http://wubx.net/mgr%E7%9B%91%E6%8E%A7%E5%8F%8A%E4%BC%98%E5%8C%96%E7%82%B9/ MGR调优参数因为基本复 ...
- git merge后如何撤销
merge后发现冲突太多,或者合并的分支代码并不是最新,那就直接撤销再合并好了. git reset --hard HEAD 用来撤销还没commit 的merge,其实原理就是放弃index和工作区 ...
- Cocos Creator 监听安卓屏幕下方返回键
addEscEvent = function(node){ cc.eventManager.addListener({ event: cc.EventListener.KEYBOARD, onKeyP ...