说明:本文是对Vamei知乎文章《快速学习Bash》(/p/32692644)一文的学习笔记,根据个人理解调整了内容顺序,补充了一些注释和说明等内容。
4.2 数学运算
在Bash中,数字和运算符都被当做普通文本。所以你无法像C语言一样便捷地进行数学运算。比如执行下面的命令:
result=1+2 $echo $result
Bash并不会进行任何运算。它只会打印文本“1+2”。
在Bash中,你可以通过“$(())”语法来进行数值运算。在双括号中你可以放入整数的加减乘除表达式。Bash会对其中的内容进行数值运算。比如:
echo $((2 + (5*2))) #不能写成result=((2+5*2)),赋值符号似乎不能识别双括号,正确的的写法是result=$((2+5*2))
将打印运算结果12。此外,在$(())中,你也可以使用变量。比如:
$var=1echo $(($var+(5*2)))
将打印运算结果11。
我们可以用Bash实现多种整数运算:
加法:$(( 1 + 6 ))。结果为7。减法:$(( 5 – 3 ))。结果为2。乘法:$(( 2*2 ))。结果为4。除法:$(( 9/3 ))。结果为3。求余:$(( 5%3 ))。结果为2。乘方:$(( 2**3 ))。结果为8。
可以把数学运算结果存入变量:
result=$(( 1 + 2 ))echo $result
4.3 返回代码
在Linux中,每个可执行程序会有一个整数的返回代码。按照Linux惯例,当程序正常运行完毕并返回时,将返回整数0。在Shell中,我们运行了程序后,可以通过$?变量来获知返回码。
如果一个程序运行正常,那么这个程序将返回0,。
如果一个程序运行异常,那么这个程序将返回非0的返回代码。
比如删除一个不存在的文件:
rm none_exist.file echo $? #返回值为1
在Linux中,可以在一个行命令中执行多个程序。比如:
touch demo.file; ls;
在执行多个程序时,我们可以让后一个程序的运行参考前一个程序的返回代码。比如说,只有前一个程序返回成功代码0,才让后一个程序运行:
rm demo.file && echo "rm succeed" #双&代表前一句命令顺利执行后再执行后一个命令如果rm命令顺利运行,那么第二个echo命令将执行。
还有一种情况,是等到前一个程序失败了,才运行后一个程序,比如:
rm demo.file || echo "rm fail" #双竖线代表若果前一个命令执行失败,才执行第二个命令如果rm命令失败,第二个echo命令才会执行。
4.4 Bash脚本
还可以把多行的Bash命令写入一个文件,成为所谓的Bash脚本。当Bash脚本执行时,Shell将逐行执行脚本中的命令。编写Bash脚本,是我们开始实现Bash代码复用的第一步。
1)脚本的例子
用文本编辑器编写一个Bash脚本hello_world.bash:
#!/bin/bash #说明了该脚本使用的shell的具体位置,这里的是/bin/bash即Bash程序echo Hello echo World #这两行代码也可以一行 echo “Hello${IFS}World"
脚本的第一行说明了该脚本使用的Shell,即/bin/bash路径的Bash程序。脚本正文是两行echo命令。运行脚本的方法有两种:
# 方法1bash hello_world.bash# 方法2chmod u+x hello_world.bash./hello_world.bash#需要注意的是,如果用户不具有执行Bash脚本文件的权限,那么他将无法执行Bash脚本。#此时,用户必须更换文件权限,或者以其他身份登录,才能执行脚本。#当脚本运行时,两行命令将按照由上至下的顺序依次执行。Shell将打印两行文本:HelloWorld
Bash脚本是一种复用代码的方式。我们可以用Bash脚本实现特定的功能。由于该功能记录在脚本中,因此我可以反复地运行同一个文件来实现相同的功能,而不是每次想用的时候都要重新敲一遍命令。我们看一个简单的Bash脚本hw_info.bash,它将计算机的信息存入到名为log的文件中:
#!/bin/bash echo "Information of Vamei's computer:" > log #">"代表定向输出到log文件lscpu >> log# ">>"代表追加到log文件末尾uname –a >> log free –h >> log
2)脚本参数
和可执行程序类似,Bash脚本运行时,也可以携带参数。这些参数可以在Bash脚本中以变量的形式使用。比如test_arg.bash:
#!/bin/bash echo $0 #显示变量0 变量0一般就是脚本名echo $1 #显示变量1 变量1一般是脚本后的第一个参数,之后依次类推echo $2 #显示变量2
在Bash中,你可以用$0、$1、$2……的方式,来获得Bash脚本运行时的参数。我们用下面的方式运行Bash脚本:
bash test_arg.bash hello world
$0是命令的第一部分,也就是test_arg.bash。$1代表了参数hello,而$2代表了参数world。因此,上面程序将打印:
test_arg.bashhelloworld
如果变更参数,同一段脚本将有不同的行为。这大大提高了Bash脚本的灵活性。上面的hw_info.bash脚本中,我们把输出文件名写死成log。我们也可以修改脚本,用参数作为输出文件的文件名:
#!/bin/bash echo "Information of Vamei's computer:" > $1 lscpu >> $1 uname –a >> $1 free –h >> $1
借助参数,我们就可以自由地设置输出文件的名字:
bash hw_info.bash output.file
3)脚本的返回代码
和可执行程序类似,脚本也可以有返回代码。还是按照惯例,脚本正常退出时返回代码0。在脚本的末尾,我们可以用exit命令来设置脚本的返回代码。我们修改hello_world.bash:
#!/bin/bash echo Hello echo World exit 0 #设置脚本返回代码为0, 其实默认自动返回为0
其实在脚本的末尾加一句exit 0并不必要。一个脚本如果正常运行完最后一句,会自动的返回代码0。在脚本运行后,我们可以通过$?变量查询脚本的返回代码:
bash hello_world.bash echo $?
如果在脚本中部出现exit命令,脚本会直接在这一行停止,并返回该exit命令给出的返回代码。比如下面的demo_exit.bash:
#!/bin/bash echo hello exit 1 echo world
你可以运行该脚本,检查其输出结果,并查看其返回代码。