目录
Bash介绍
Bash是一个命令处理器,通常运行于文本窗口中,并能执行用户直接输入的命令。Bash还能从文件中读取命令,这样的文件称为脚本。和其他Unix shell 一样,它支持文件名替换(通配符匹配)、管道、here文档、命令替换、变量,以及条件判断和循环遍历的结构控制语句。
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。
在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。
实验目的
掌握Bash命令处理器的使用
实验环境
树莓派4B、系统:Ubuntu 20.10系统 、vim软件
实验步骤与内容:
1.Bash 函数
Bash可以用户定义函数,然后在Bash脚本中可以随便调用。
Bash中函数的定义格式如下:
[ function ] funname [()]
{
action;
[return int;]
}
说明:
- 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
- 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
下面的例子定义了一个函数并进行调用:
#!/bin/bash
demoFun(){
echo "This is a fun"
}
echo "-----start-----"
demoFun
echo "-----end-----"
执行此脚本,输出结果如下:
下面的示例定义一个带有return语句的函数:
#!/bin/bash
funWithReturn(){
echo "add alg"
echo "input first num: "
read aNum
echo "input second num: "
read anotherNum
return $(($aNum+$anotherNum))
}
funWithReturn
echo "add is $? !"
执行结果如下:
函数的返回值通过$!来得到。
注意:所有的函数都必须在使用前进行定义。调用函数使用函数名来调用。
函数参数
在Bash中,调用函数时可以向其传递参数。在函数体内部,可以通过 $n 的形式来获取参数的值,例如,$1表示第一个参数。
示例如下:
#!/bin/bash
funWithParams(){
echo "$1"
echo "$2"
echo "$3"
echo "all params have $# "
echo "all params is $* "
}
funWithParam 1 2 3
输出结果为:
下面有几个命令可以来处理参数:
参数 | 功能说明 |
$# | 得到函数总共有多少参数 |
$* | 显示所有向脚本传递的参数 |
$$ | 显示当前脚本运行进程的ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
$? 仅对其上一条指令负责,一旦函数返回后其返回值没有立即保存入参数,那么其返回值将不再能通过 $? 获得。
#!/bin/bash
function demoFun1(){
echo "This is demofun1"
return `expr 1 + 1`
}
demoFun1
echo $?
function demoFun2(){
echo "This is demofun2"
expr 1 + 1
}
demoFun2
echo $?
demoFun1
echo "-----"
echo $?
输出结果如下:
通过上面的结果可以看到最后因为在调用demoFun1函数后加了一句echo命令,这也就导致最后一句$?获得的结果为0。
调用 demoFun2 后,函数最后一条命令 expr 1 + 1 得到的返回值($?值)为 0,意思是这个命令没有出错。所有的命令的返回值仅表示其是否出错,而不会有其他有含义的结果。
第二次调用 demoFun1 后,没有立即查看 $? 的值,而是先插入了一条别的 echo 命令,最后再查看 $? 的值得到的是 0,也就是上一条 echo 命令的结果,而 demoFun1 的返回值被覆盖了。
同时函数和命令的执行结果可以作为条件语句使用。Bash语言中0代表true,0以外的值代表false。
示例代码如下:
#!/bin/bash
function demofun1(){
return 0
}
function demofun2(){
return 1
}
if demofun1
then
echo true
else
echo false
fi
if demofun2
then
echo true
else
echo false
fi
输出结果如下:
将函数作为条件语句交给 if 判断,得出返回值为 0 时,依然为 true,而返回值只要不是 0,条件语句都判断为 false。
2.Bash文件包含
Bash和其他编程语言差不多也可以包含一些外部的脚本。可以比较方便的封装一些公共的代码以便其他的文件也可以使用
语法格式如下所示:
. filename
或
source filename
注意:点号和文件名之间要有空格
示例代码如下:
1.创建两个Bash脚本文件:
testfile1.sh的代码:
#!/bin/bash
animal="cat"
testfile2.sh的代码:
#!/bin/bash
. ./test1.sh
#或
# source ./test1.sh
echo "you favourite animal is:$animal"
执行testfile2.sh脚本,输出结果如下:
you favourite animal is:cat
注意:被包含的文件testfile1.sh不是必须要有可执行权限
3.Bash随机数
Bash当中也提供了随机数这个功能。示例代码如下:
#!/bin/bash
r=$RANDOM
echo $r
上述代码可以在执行的时候随机的打印出来一个在1到65536之间的整数。
4.Bash当中的一些保留变量
保留变量 | 功能说明 |
$IFS | 变量中保存用于分割输入参数的分割字符,默认是空格。 |
$PATH | 存储当前 Bash的默认路径字符串。 |
$HOME | 存储当前用户的根目录路径。 |
$PS1 | 代表第一个系统提示符 |
$PS2 | 代表第二个系统提示符 |
$PWD | 表示当前的工作路径 |
$EDITOR | 表示系统的默认编辑器名称。 |
$BASH | 表示当前Bash的路径名称字符串 |
5.Bash变量的操作
Bash当中一些对变量的操作,下面主要讲解一下对于${num}命令的一些新功能。
参数 | 功能说明 |
${num-default} | 这个命令表示如果num变量还没有设置,就会保持num没有设置的状态,返回设置的默认值default |
${num=default} | 这个命令是如果num没有设置,就会直接去后面的defalut默认值 |
${num+other} | 表示如果num已经设置了值,就会返回other的值,否则返回null(空) |
${num?error} | 表示如果变量 num已经设置,则返回该变量的值,否则就将后面的 error 输出到标准错误输出上 |
${num#pattern}和${num##pattern | 删除变量 num 中最短/最长的和 pattern 相匹配的最早的字符串 |
${num%pattern}, ${num%%pattern} | 删除变量 num 中最短/最长的和 pattern 相匹配的最晚(也就是最靠右)的字符串 |
${num:n} | 表示删除变量num的前n个字符 |
${num:n:m} | 表示变量 num 中去掉前 n 个字符后的剩余字符串的前 m 个字符 |
${num/a/b} | 表示将变量 num 中第一个出现的 a 字符串替换为 b 字符串 |
${var//a/b} | 表示将变量 $var 中出现的所有 a 字符串全部都替换为 b 字符串 |
6.Bash的调试
查看一个出错的 BASH 脚本到底错在什么地方,可以帮助程序员找出脚本中的错误,这是十分有用且方便的。
bash -x bash-script
另外用 trap 语句可以在 BASH 脚本出错退出时打印出一些变量的值,以供程序员检查。trap 语句必须作为继 "#!/bin/bash" 后的第一句非注释代码,一般 trap 命令被写作: trap 'message $checkvar1 $checkvar2' EXIT。