一、什么是shell脚本?
基本上,shell脚本有点像是早期的批处理文件(.bat),即将一些命令集合一起一次执行(一次性执行多个命令)。但是shell脚本拥有更强的功能,那就是它可以进行类似程序的编写,并且不需要经过编译就能够执行。
shell脚本是利用shell的功能所写的一个程序。这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能,已达到我们想要的功能。
二、脚本的书写规范
格式:必须 #!/bin/shell 起头(当文件执行的时候,能加载bash相关的配置文件,一般来说是非登录 shell的 ~/.bashrc)
拥有可读、执行权限:chmod a+x 文件名
执行脚本:
①、./xx.sh
②、bash xx.sh
③、source xx.sh
④、sh xx.sh
注意:
①、命令是从上向下、从左向右分析与执行的
②、命令、选项与参数之间的多个空格会被忽略
③、空白行也将会被忽略掉,并且[Tab]键所产生的空白同样视为空格键
④、如果读取到一个Enter符号(CR),就尝试开始执行改行(或该串)命令
⑤、至于如果一行内容太多,写不下可以换行
⑥、【#】后面的所有内容被当做注释
编写脚本的时候,需要说明该脚本的:
①、内容与功能
②、版本信息
③、作者和联系方式
④、建文件日期
⑤、历史记录
⑥、脚本内较特殊的命令,使用【绝对路径的方式来执行】
⑦、脚本运行时需要的环境变量预先声明和设置
三、shell脚本的练习
1、交互式脚本:变量内容由用户决定
很多时候安装的时候会问你【需要安装的目录】,这个时候就是让用户去输入变量内容。
案例一:让用户输入:姓名,最后在屏幕上输出用户输入的信息
脚本信息如下:
显示效果如下:
2、随日期变化:利用date创建文件
案例二:创建三个文件,文件名为分别为 a)自定义名字+当前时间、b)自定义名字+前一天时间、c)自定义名字+前二天时间
脚本编写代码如下:
显示效果如下:
3、数值运算:简单的加减乘除
案例三:用户输入两个数字,实现相乘
脚本编写代码如下:
显示效果如下:
在数值运算上可以使用:
declear -i total=${number1}*${number2}
total= `expr $number1 \* $number2`
total=$((${number1}*${number2}))
关于bc命令的使用如下:
通过管道符
$ echo "15+5" | bc
20
scale=2 设小数位,2 代表保留两位:
$ echo 'scale=2; (2.777 - 1.4744)/1' | bc
1.30
bc 除了 scale 来设定小数位之外,还有 ibase 和 obase 来其它进制的运算:
$ echo "ibase=2;111" |bc
7
进制转换
#!/bin/bash
abc=192
echo "obase=2;$abc" | bc
<pre>
<p>
执行结果为:11000000,这是用bc将十进制转换成二进制。</p>
<pre>
#!/bin/bash
abc=11000000
echo "obase=10;ibase=2;$abc" | bc
执行结果为:192,这是用bc将二进制转换为十进制。
计算平方和平方根:
$ echo "10^10" | bc
10000000000
$ echo "sqrt(100)" | bc
10
四、判断式
1、关于某个文件名的【文件类型】判断存在否(结合 && 和 || 进行判断)
语法:test [-efd] filename
“ -e ”表示该【文件名】是否存在(exit)
“ -f ”表示该【文件名】是否存在切位一个文件(file)
“ -d ”表示该文件是否存在且为目录(directory)
案例四:判断文件是否为文件
2、关于文件的权限检测
语法:test [-rwx] filename
“ -r ”检测该文件是否有【可读】权限
“ -w”检测该文件是否有【可写】权限
“ -x ”检测该文件是否有【可执行】权限
案例五:检测文件是否拥有权限
3、比较两个文件
语法:test file1 [-nt] [-ot] file2
“ -nt ”判断file1是否比file2新(newer than)
“ -ot ”判断file1是否比file2旧(older than)
案例六:判断文件的创建时间
4、关于两个整数之间的比较
语法:test number1 [-eq] [-ne] [-gt] [-lt] [-ge] [-le] number2
“ -eq ”表示两个数字相等
“ -ne ”表示两数字不相等
“ -gt ”表示n1 > n2
“ -lt ”表示n1 < n2
“ -ge ”表示n1 >= n2
“ -le ”表示n1 <= n2
案例七:判断两数是否相等
5、判定字符串的数据
语法:test [-zn] [string1 ==/!= string2]
“ -z ”判定字符串是否为0?0则返回true
“ -n ”判定字符串是否非0?非0返回true
案例八:判断字符串是否为0
6、多重条件判断
语法:test -r filename [-a0!] -x filename
“ -a ”表示(and)两条件同时成立。例如:test -r file1 -a -x file1,则file1同时拥有可读和可执行权限时,则返回true
“ -o ”表示(or)两条件任何一个成立
“ ! ”表示非。例如: test ! -x file,则file1不拥有可执行权限则返回true
案例九:让用户输入一个文件名;判断是否存在,不存在则中断;存在则判断是否是文件或者目录;判断对这个文件或目录所拥有的权限并输出。
脚本代码如下:
显示效果如下:
7、利用判断符号 []
例如:想要知道 ${HOME} 变量是否为空。
语法:
[ -z "${Home}" ] ; echo $?
注意:当中使用中括号作为shell的判断式时,必须注意中括号的两端需要有空格符来分割。
案例十:程序执行时,用户选择Y/y或N/n;如果输入Y/y则显示ok,如果输入N/n则显示no;如果是其他的字符则显示don’t。
脚本代码如下:
显示效果如下:
五、脚本的默认变量($0、$1…)
$#:代表后接的参数【个数】
$@:代表【“$1”“$2”“$3”】之意,每个变量是独立的(用双引号括起来)
$*:代表【“$1c$2c$3”】,其中c为分割字符,默认为空格
案例十一:查看程序的文件名;参数的个数;如果参数的个数小于2则告知参数数量太少;显示全部参数的内容。
脚本代码如下:
显示效果如下: