- 1、本文档共28页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
03_Shell函数
Shell函数
本章目标
掌握字符串截断
了解Shell函数基本概念
了解Shell函数的定义
掌握Shell函数使用
重点难点
字符串截断
shell函数定义
shell函数调用
字符串截断
Shell编程中经常要对字符串进行处理
对于文件名的简单截断,可以使用basename和dirname
如果要进行更复杂的截断,可以使用bash 内置的变量扩展功能
前截断
#!/bin/sh
MYVAR=foodforthought.jpg
echo ${MYVAR##*fo}
echo ${MYVAR#*fo}
rthought.jpg
odforthought.jpg
注意
在上述例子中,输入了 ${MYVAR##*fo}。它的确切含义是什么?可以这样理解:
首先通过${ }找到变量MYVAR的值foodforthought.jpg。
然后在变量中查找能够匹配通配符 (*fo)的子串。
两个 ##,说明是匹配通配符 *fo 的 最长子字符串
然后将源字符串从找到子字符串的开始处截去。
前截断说明
f
fo MATCHES *fo
foo
food
foodf
foodfo MATCHES *fo
foodfor
foodfort
foodforth
foodfortho
foodforthou
foodforthoug
foodforthought
foodforthought.j
foodforthought.jp
foodforthought.jpg
短截断与后截断
“##”表示长截断,是将匹配的最长字符串截断
“#”表示将匹配的最短字符串截断
若要将匹配字符串后面的内容截断,可以使用“%%”或“%”
前截断
#!/bin/sh
MYFOO=chickensoup.tar.gz
echo ${MYFOO%%.*}
echo ${MYFOO%.*}
chickensoup
chickensoup.tar
记忆方法
在标准键盘上,shift-4 是 $,它是 bash 变量扩展字符。
紧靠 $ 左边的是 #,也就是说:# 位于 $ 的“开始处”,# 从字符串的开始处除去字符。
反之 $ 右边的字符是%,%代表除去字符串后面的字符。
重复两次代表长匹配,单独一次代表短匹配。
为什么要用函数
函数定义后可以多次调用,提高代码重用性,提高开发效率。
函数修改方便,有利于提高代码灵活性。
函数定义
函数定义的语法如下:
函数名()
{
body
}
显示文件内容
#!/bin/sh
tarview() {
echo -n Displaying contents of $1
if [ ${1##*.} = tar ]; then
echo (uncompressed tar)
tar tvf $1
elif [ ${1##*.} = gz ]; then
echo (gzip-compressed tar)
tar tzvf $1; then
echo (bzip2-compressed tar)
fi
}
又见$1
在上例中,又出现了$1。
函数中出现的$1,不是表示Shell程序的第一个参数,而是表示当前函数的第一个参数。
上例中出现的${1##*.}是什么意思?
函数调用
Shell编程中的函数调用和C语言中不同,不带括号:
函数名 参数1 参数2 ...
将shell程序获得的第一个变量做为参数,调用上例中的函数:
从使用上说,shell函数调用更类似于
Linux中命令的使用
#!/bin/sh
# 函数定义...
tarview $1
c函数作用域
在编写c程序时,函数内部定义的变量,其作用域局限在该函数内部。
若在函数中定义的变量名和外部其它的变量名相同,将发生覆盖。
void foo();
void main(){
int a=10;
foo();
printf(%d,a);
}
void foo(){
int a=20;
}
shell函数作用域
在编写shell程序时,函数内部定义的变量默认情况下具有程序级作用域。
若在函数中定义的变量名和外部其它的变量名相同,将不会发生覆盖,在函数内部修改变量,会影响到函数外部该变量的值。
或要指定变量的作用域局限在函数内部,应该使用local命令。
作用域案例
#!/bin/sh #!/usr/bin/env bash
myvar=hello
myfunc() {
myvar=one two three
for x in $myvar
文档评论(0)