shellNote--day11
shellNote
day11
-
创建函数
function name { commands }
name属性定义了函数的唯一名称,脚本中定义的每个函数必须有一个唯一的名称;
commands是构成函数的一条或多条shell命令,调用是会按顺序依次执行;
另一种定义函数的格式:
name() { commands }
-
使用函数
在脚本中使用函数,跟使用其他shell命令一样,在行中指定函数名就行了;
#!/bin/bash function func { echo "this is a example" } echo "hello" func echo "end"
-
函数的定义需要的使用之前;
-
由于函数名唯一,所以重定义了函数,之后的调用会使用新的函数;
-
-
返回值
-
默认退出状态码
函数的退出状态码是函数中最后一条命令返回的退出状态码,在函数结束,可以用标准变量$?来确定函数的退出状态码;
-
$?变量
确定函数的退出状态码;
-
使用return
可以使用return来退出函数并返回特定的退出状态码;
注意:
-
函数一结束就要取返回值;
-
退出状态码必须是0-255;
-
$?变量只是返回执行的最后一条命令的退出状态码,所以在函数执行之后,又执行了其他命令,返回值就丢失了;
-
-
使用函数输出
可以对函数的输出保存到shell变量中,这样就可以获得返回的较大的整数值或字符串值;
result=$(function)
#!/bin/bash function dbl { read -p "enter a value" value echo $[ $value * 2 ] } result=$(dbl)
例子中,read也会有一条输出,但shell会将其忽略掉,假如使用了echo来输出"enter a value"的话,那么他也会读进result变量中
-
-
向函数传递参数
shell会把函数当做脚本来操作,所以向函数传递参数,实际上跟普通脚本传递参数一样;
函数使用标准的参数环境变量来表示命令行上传的参数;
例如:函数名$0,其他参数$1,$2等,也可以用特殊变量$#来判断传给函数的参数数量;
使用函数传参,参数和函数必须在同一行:
func $value 10
注意:函数中的$1或$2和主体脚本的$1和$2不一样,必须在调用时传递给函数
-
全局变量
全局变量在shell脚本中任何地方都有效;
默认情况下,在脚本中定义的变量都是全局变量;
在函数外定义的变量可以在函数内访问;
-
局部变量
函数中使用的变量可以声明为局部变量;
只需要在变量声明前加上local关键字即可;
local temp
local关键字保证了变量是在函数内有效,函数之外有同名变量,两者是分离开来的,互不影响;
-
向函数传递数组
不能将数组当单个参数传递,这样的话只能传递数组的第一个值;
需要将数组的变量分解为单个的值,将这些值都作为函数参数使用;
在函数内部,在将这些值重新组合为一个新的数组;
#!/bin/bash function func { local newarray newarray=($(echo "$@")) } myarray=(1 2 3 4 5) func ${myarray[*]}
-
从函数返回数组
函数用echo语句输出单个数组的值,然后脚本再将其重新放入新的数组变量中;
#!/bin/bash function func { local array=(1 2 3 4 5) echo ${array[*]} } result=($(func)) echo "array is : ${result[*]}"
-
创建库
可以将常用的功能函数,创建为一个库文件;
需要使用的时候,引用库文件即可在脚本中使用库文件中的函数;
-
使用函数库–source
source命令会在当前shell上下文中执行命令,并不会创建一个新的shell;
使用source命令在shell脚本中运行库文件脚本;
source命令快捷的别名: 点操作符;
运行库文件myfuncs脚本:
source ./myfuncs
. ./myfuncs
-
在命令行创建函数
单行方式,需要注意每个命令后面加个分号;
多行方式,在输入一行后,shell会输出>,然后可以继续编写函数,直到在函数结尾使用},shell会知道完成了函数的定义;
-
在.bashrc文件定义函数
命令行创建函数,退出shell时便会丢失;
常用的函数或库文件,可以定义在.bashrc文件中;
-
shtool库文件
shtool库文件提供一些简单的shell脚本函数,需要可以使用;
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- WebAssembly之wasm格式解析
- 消息队列
- 在java中boolean类型占多少字节?
- 调素数
- DFS(小白式超详细讲解以及代码讲解)
- 判断一个序列是否有序(升序或者降序)
- 有关dp问题的机器人走地图
- 有关结构体内重载操作的最详细的讲解~~
- 洛谷 P1002 DP解法
- AtCoder Beginner Contest 163 A~~D 详细代码讲解
- HUD 4841 (vector的用法)
- c++ 优先队列(priority_queue)的详细讲解用法
- HDU 1022(关于栈的详细解法)
- count_if函数的用法
- Codeforces Round #633 (Div. 2) A ~~C