【shell 脚本笔记】1. 构建基本脚本
最好的教学办法就是结合案例,所以我们结合代码来学习脚本。
-
脚本开头要指定使用的
bash
。一般来说,linux
发行版基本都预装bash
,所以我们需要在每个脚本开头加上这么一行:#!/bin/bash
-
最简单的
shell
脚本只需要由一系列Linux
命令行组成:#!/bin/bash ls -al | grep *.md date
-
记得在
vim
中写完脚本后输入:w
才能写入到文件。 -
可以使用
echo
命令来简单的显示信息:#!/bin/bash echo "The date is: " date
但是如果你想在同一行显示,你需要在
echo
后加-n
参数,这会把当前行跟下一行的信息输出在同一行。#!/bin/bash echo -n "The date is:" date
-
我们也可以在脚本中使用变量。脚本变量分为系统变量和用户变量。我们这样使用系统变量:
#!/bin/bash echo "The user information is:" echo UID:$UID echo HOME:$HOME
如上,只需要在变量名前加
$
即可。同时你会发现,shell
中大写变量和小写变量的高亮色彩是不一样的,一般来说,我们使用大写字母表示系统变量和shell变量,而使用小写字母表示我们自己使用的临时变量。就像这样:#!/bin/bash tmpVar="hello " echo $tmpVar echo $USER
关于变量,我们还需要知道的是,我们可可以将变量放在双引号中,他会被自动替换,就像这样:
#!/bin/bash tmpVar="hello" echo "$tmpVar world!"
另外,
shell
是一门动态语言,你无需指定他的类型,他会自动推导其本身的类型。还有,最重要的是,引用变量对其进行赋值时不需要使用
$
,而引用变量值时则需要使用$
。就像这样:#!/bin/bash var=10 tmp=$var test=var echo "var:$var" echo "tmp:$tmp" echo "test:$test"
-
我们还可以使用命令替换,我们从命令输出中提取信息,并将其赋给变量。
这种命令有两种格式。一是这样 test=\`date\`,二是`test = $(date)`。注意的是,第一种形式中,我们使用`tab`键上面的那个符号来包裹我们的命令: 就像这样:
#!/bin/bash te=$(ls -al | grep *.sh) tes=`ls -al` echo $te echo $tes
> **WARNING** > > 一定要注意的一个问题就是,我们在赋值的时候,**不要在`=`两侧加空格**。 >
-
关于重定向和输出,我们还需要知道的是,我们使用
>
来重定向输出流,它会覆盖原文件的内容,如果原文件不存在,就创建它。我们使用>>
表示在文件末尾追加字符。 此外,我们还可以直接在命令行中重定向数据,需要注意的是内联重定向。内联重定向可以任意字母开头,但是必须以同样的字母结尾。
就像这样:
wc << END
> this
> is
> a
> simple
> test
> END
-
在shell里,我们可以这样执行算术运算
$ expr 1 + 4 5
WARNING:
我们把上述+号左右的空格去掉,你就会发现输出了
1+4
。这是完全不同的,要注意。我们可以在脚本中这样做:
#!/bin/bash var1=3 var2=4 var3=$(expr $var1 / $var2) echo "var1 / var2 = $var3"
我们会发现,结果是 0 ,并不是我们期待的 0.75 ,实际上,shell 并不支持浮点数运算,它只能进行整数运算。
实际上,使用
expr
这样的形式很不方便,所以我们还有一个改进方案,使用方括号,这是我们推荐的:#!/bin/bash var1=100 var2=200 var3=$[$var1 / $var2]
-
如前所述,我们怎么解决浮点数运算呢?我们可以使用 bc 计算器,就像这样:
#!/bin/bash var1=8 var2=4 var3=$(echo "scale=4; $var1 / $var2" | bc) echo $var3
-
此外,我们还需要知道,脚本的一些状态表示。
linux 提供一个专门的变量
$?
来保存上个已执行命令的退出状态。一般来说, 一个成功命令的退出状态码为 0 ;如果一个命令结束时有错误,退出状态码就是一个正数值。
我们可以在
shell
中通过exit
命令指定退出状态码,就像下面这样:#!/bin/bash eixt 4
WARNING
退出状态码只能在 0-255 之间。超过这个区间的状态码,shell 会对其进行取余操作。
To be countinued…