文章目录
一、函数
1、函数的定义格式
[ function ] funname [()]
{
action;
[return int;]
}
说明:
1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
2、案例1
#!/bin/bash
show_info()
{
echo -e "$HOME"
echo -e "$PWD"
echo -e "$(date)"
}
show_info
function show_info1()
{
echo -e "$HOME"
echo -e "$PWD"
echo -e "$(date)"
}
show_info1
3、案例2
#!/bin/bash
funwithReturn(){
echo "函数实现了两个数的相加功能"
echo "输入的第一个数为:"
read num1
echo "输入的第二个数为:"
read num2
echo "两个数分别为$num1和$num2"
return $[$num1+$num2]
}
funwithReturn
echo "输入的两个数字之和为:$?"
执行结果
ubuntu@VM-24-12-ubuntu:~/20221212$ bash func1.sh
函数实现了两个数的相加功能
输入的第一个数为:
10
输入的第二个数为:
10
两个数分别为10和10
输入的两个数字之和为:20
函数返回值在调用该函数后通过 $? 来获得。
注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。
shell脚本使用 bash 脚本名称 的方式执行的时候 本身不需要有可执行权限
但是直接执行 ./脚本名称执行的时候,需要可执行权限。
二、函数参数
$#
传递到脚本或函数的参数个数
$*
以一个单字符串显示所有向脚本传递的参数
$@
与$*
相同,但是使用时加引号,并在引号中返回每个参数。
$?
显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
#!/bin/bash
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
执行结果:
ubuntu@VM-24-12-ubuntu:~/20221212$ bash func2.sh
第一个参数为 1 !
第二个参数为 2 !
第十个参数为 10 !
第十个参数为 34 !
第十一个参数为 73 !
参数总数有 11 个!
作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !
三、输入/输出重定向
1、标准输入输出
一般情况下,每个Unix/Linux命令运行的时候,都会打开三个文件:
标准输入文件(stdin):文件描述符0,stdin就是控制台输入
标准输出文件(stdout):文件描述符1,stdout就是控制台输出
标准错误文件(stderr):控制台也会读取stderr的错误信息
2、输出重定向:
一般通过在命令间插入特定的符号来实现。
2.1、语法如下所示:
command1 > file1
特别注意:
上面这个命令执行command1然后将输出的内容存入file1。
注意任何file1内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用>>操作符。
2.2、案例:输出重定向会覆盖文件内容,请看下面的例子:
ubuntu@VM-24-12-ubuntu:~/20221212$ echo "今天要加油吖~" > time
ubuntu@VM-24-12-ubuntu:~/20221212$ cat time
今天要加油吖~
2.3、如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾,例如:
ubuntu@VM-24-12-ubuntu:~/20221212$ echo "2022-12-13" >> time
ubuntu@VM-24-12-ubuntu:~/20221212$ cat time
今天要加油吖~
2022-12-13
3、输入重定向
语法为:
command1 < file1
这样,本来需要从键盘获取输入的命令会转移到文件读取内容。
注意:输出重定向是大于号(>),输入重定向是小于号(<)。
3.1、统计 users 文件的行数
ubuntu@VM-24-12-ubuntu:~/20221212$ wc -l test1.sh
8 test1.sh
3.2、将输入重定向到 users 文件
ubuntu@VM-24-12-ubuntu:~/20221212$ wc -l < test1.sh
8
注意:上面两个例子的结果不同:第一个例子,会输出文件名;第二个不会,因为它仅仅知道从标准输入读取内容。。
4、/dev/null 文件
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到”禁止输出”的效果。
$ command > /dev/null 屏蔽标准输出
$ command &> /dev/null 屏蔽标准错误输出
四、文件名扩展
1、?:代表文件路劲里面的任意单个字符串,不包含空字符串
案例1:查找当前目录下,以sh结尾并且文件名只包含2个字符
ubuntu@VM-24-12-ubuntu:~/20221212$ ls ??.sh
if.sh
2、* :代表路径中任意数量的任意字符,包括0个字符
案例2:输出后缀为.sh的文件
ubuntu@VM-24-12-ubuntu:~/20221212$ ls *.sh
break.sh case.sh for.sh func1.sh func2.sh func.sh if.sh test1.sh test2.sh while.sh
要注意的是:*
不会匹配隐藏文件
如果要匹配隐藏文件 ls .*
ubuntu@VM-24-12-ubuntu:~/20221212$ ls .*
.:
break.sh for.sh func2.sh if.sh test1.sh time.txt while.sh
case.sh func1.sh func.sh myfile test2.sh users
..:
20221212
3、[]:扩展形式是[…],扩展为括号之中的任意一个字符,
比如[aeiou]可以匹配5个元音字母中的任意一个
案例3、查找当前目录下,文件名包含a或者b的文件
ubuntu@VM-24-12-ubuntu:~/20221212$ ls *[ab]*.sh
break.sh case.sh
方括号扩展还可以有两种变体
[^…]和[!..]表示不匹配方括号里面的字符,两种写法是等价的
案例4、查找当前目录下,文件名第2个字符不是a,并且以sh结尾的文件
ubuntu@VM-24-12-ubuntu:~/20221212$ ls ?[!a]*.sh
break.sh for.sh func1.sh func2.sh func.sh if.sh test1.sh test2.sh while.sh
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/73930.html