shell学习三十一天----函数问题

函数

案例一:

#!/bin/bash

hello () {

echo "hahahah"

}

hello

执行函数,结果为:hahaha

案例二:

#!/bin/bash

funWithReturn()

{

echo "the function is to get the sum of two number"

read -p "input first number" num1

read -p "input second number" num2

echo "the two number are $num1 and $num2 !"

return $(( $num1+$num2 ))

}

funWithReturn

ret=$?

echo "sum = $ret"

执行函数,得到两个数的和.

案例三:

#!/bin/bash

number_one() {

echo "number_one"

number_two

}

number_two()

{

echo "number_two"

}

number_one

执行命令:[[email protected] tmp]# sh function2.sh

输出结果:

number_one

number_two

分析:定义shell函数的语法为

[funciton] funname [()]

{

action

[ return int ]

}

说明:

1.可以带function fun()定义,也可以直接fun()定义,不带任何参数(关键字function可以省略).

2.函数返回,可以显示的加:return返回,如果不加,将以最后一条命令的运行结果作为返回值.

Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以速度很快,另外,Shell还能对函数进行预处理,所以函数的启动比脚本更快。

语句部分可以是任意的Shell命令,也可以调用其他的函数。

如果在函数中使用exit命令,可以退出整个脚本,通常情况,函数结束之后会返回调用函数的部分继续执行。

可以使用break语句来中断函数的执行。

declare –f 可以显示定义的函数清单

declare –F可以只显示定义的函数名

unset –f 可以从Shell内存中删除函数

export –f将函数输出给Shell

另外,函数的定义可以放到.bash_profile文件中,也可以放到使用函数的脚本中,还可以直接放到命令行中,还可以使用内部的unset命令删除函数。一旦用户注销,Shell将不再保持这些函数。

补充一下,就是:

$0:是脚本本身的名字;

$#:是传给脚本的参数个数;

[email protected]:是传给脚本的所有参数的列表,即被扩展为"$1" "$2" "$3"等;

$*:是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个,即被扩展成"$1c$2c$3",其中c是IFS的第一个字符;

$$:是脚本运行的当前进程ID号;

$?:是显示最后命令的退出状态,0表示没有错误,其他表示有错误;

举例说:

脚本名称叫test.sh 入参三个: 1 2 3

运行test.sh 1 2 3后

$*为"1 2 3"(一起被引号包住)

[email protected]为"1" "2" "3"(分别被包住)

$#为3(参数数量)

其中exit  是用来结束一个程序的执行的,而return只是用来从一个函数中返回。

exit(0)表示正常退出执行程序,如果加其它的数值:1,2,....可以表示由于不同的错误原因而退出 。

那么,1,2,3怎么对应不同的原因?   --你自己想让它是什么意思,它就是什么意思.

但一般都有常用的、通用的含义:比如   0   一般都表示正常返回、退出。

因此,,在main函数中exit(0)等价于return 0。

全局变量

这种类似与C语言中的全局变量(或环境变量)

案例:

#!/bin/bash

g_var=

function mytest()

{

echo "mytest"

echo " args $1"

g_var=$1

return 0

}

mytest 1

echo "return $?"

echo

echo "g_var=$g_var"

分析:主要是echo "return $?"输出时0不好理解,这个是说上一行的mytest这个函数执行成功了,所以值为0,但是在这个函数的内部给全局变量重新赋值.所以结果为:

mytest

args 1

return 0

g_var=1

函数没有提供局部变量.因此所有的函数都与父脚本共享变量;即,你必须小心留意不要修改父脚本里不期望改变的东西,例如:path.不过这也表示其他状态是共享的,例如当前木与捕捉信号.

时间: 2024-11-08 19:13:19

shell学习三十一天----函数问题的相关文章

shell学习总结之自定义函数

shell学习总结之自定义函数 Myfun (){ echo patams1 is $1 echo -n "now i is $i " ! [ "$i" ] && exit ; echo jj return '1' } myf=$(Myfun); echo myf Myfun 12 unset Myfun Myfun echo 'the end !'$myf 别人的 #! bin/bash # ----------------------------

Oracle学习(三):单行函数

1.知识点:可以对照下面的录屏进行阅读 SQL> --字符函数 SQL> --字符串的转换 SQL> select lower('hellO WORld') 转小写,upper('hellO WORld') 转大写,initcap('hello world') 首字母大写 2 from dual; SQL> --substr(a,b) 从a中,第b位开始取,取右边所有的字符 SQL> select substr('Hello World',4) from dual; SQL&

鸟书shell学习(三)shell脚本程序设计要点总结

一 注意事项 1.脚本的开头一行为 : #!/bin/bash 声明这个脚本需要的shell的名称 2.程序中出了"#!"之外的其他以#开头的都是注释内容 3.为了方面的使用系统命令,可以在程序的开始部分设置主要环境变量例如PATH 4.脚本程序的运行方法: sh example.sh 或者类似 bash example.sh chmod +x example.sh ; ./example.sh    ################################ 这两种执行方式都是

shell学习四十一天----列出文件ls和od命令

列出文件 首先恶臭命令提供简单的方式列出匹配模式的文件: 命令: echo /bin/*sh #显示/bin下的shell 输出:/bin/bash /bin/csh /bin/dash /bin/sh /bin/tcsh 分析:shell将通配符字符模式替换为匹配的文件列表,echo以空格区分文件列表,在单一行上显示他们.echp不会更近一部解释他的参数,因此与文件系统里的文件也没有任何关系. ls命令则比echo能做更多的处理,因为他纸袋自己的参数应该是文件.未提供命令行选项时,ls只会验证

shell学习三十四天----printf详解

printf 先来看一个简单的例子:使用命令printf "hello,world\n", 输出:hello,world 再使用echo "hello,world\n",输出为:hello,world\n 案例二:使用命令printf "%s\n" hello,world 输出结果为:hello,world printf命令的完整语法有两个部分: printg format-string [arguments] 第一部分为描述格式规格的字符串,他

shell学习三十天----break,continue,shift,getopts

break和continue 这两个命令分别用来退出循环,或跳到循环体的其他地方. 使用while与break,等待用户登录 bash代码: printf "Enter username: " read user while true do if who | grep "$user" >/dev/null then break; fi sleep 30 done 等待特定用户,每30秒确认一次 true命令什么事也不必做,只是成功的退出.这用于编写无限循环,即

linux shell学习笔记二---自定义函数(定义、返回值、变量作用域)介绍

linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ function ] funname [()] { action; [return int;] } 说明: 1.可以带function fun() 定义,也可以直接fun() 定义,不带任何参数. 2.参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值. retu

shell学习三十五天----波浪号展开与通配符

波浪号展开与通配符 shell中两种与文件名相关的展开.第一种是波浪号展开,第二种是通配符展开式. 波浪号展开 如果命令行字符串的第一个字符为波浪号(~),或者变量指定(例如PATH或CDPATH变量)的值里任何未被引号括起来的冒号之后的第一个字符为波浪号(~)时,shell变回执行波浪号展开. 波浪号展开的目的,将用户根目录的符号型表示方式,改为实际的目录路径.可以采用直接或间接的方式指定执行此程序的用户,如未明白指定,则为当前的用户: 命令:vi ~/.profile       与vi $

shell学习三十七天----引用

引用 案例,如果我想输出一个星号(*),使用echo如何做? echo * 这是肯定不行的,需要将*转移,即:echo \* 这样就引出了引用的概念.所为引用,是用来防止shell将某些你想要的东西解释成不同的意义.如果你希望某些可能被shell视为个别参数的东西保持为单个参数,这时你就必须将其引用. 引用的三种方式: 反斜杠转义 字符前置反斜杠(\),用来告知shell该字符即为其字面上的意义. 单引号 单引号('...')强制shell将一对引号之间的所有字符都看做其字面上的意义.shell