shell语法总结二(持续补充)

导读:本篇文章讲解 shell语法总结二(持续补充),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

在这里插入图片描述


一、函数

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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!