此篇,我们将制作一个简单的shell脚本,其主要功能为:
- 接受用户的两个输入
- 如果两个输入均为数字,则计算“输入1”和“输入2”的和,以及在他们中,大数与小数的差
- 如果有一个为普通字符串,则输出非数字的提示
- 如果第一个参数为文件,则输出文件内容
- 如果第一个参数为文件,且存在第二个参数,则向文件中增量写入第二个参数后,输出文件内容
脚本的效果如下
![](https://img.haomeiwen.com/i10420503/a8893a4196857cd1.gif)
一 变量
shell中常见的变量概念有四种种:环境变量
、用户变量
、输入(位置)变量
、内部变量
。
三种变量中,无论那种,其取值方式均一样。为$
+变量名
,比如要取环境变量中的HOME
,则可以直接在文件中使用$HOME
获取变量。
关于环境变量
前述文章中已经讲过,可以理解为shell脚本
运行环境中的变量。不再赘述。
1.1 用户变量
是用户在脚本中,声明的变量。其声明格式为:
变量名 = 变量值
比如如下,其中num
为变量名,10
为变量值:
num = 10
注意:变量在声明时,前面不加$
符
当我们需要使用变量时,比如将变量输出到屏幕,则可以使用$
+变量名
来获取变量的实际值:
echo $num
1.2 输入(位置)变量
当我们调用某个shell脚本时,我们可以添加上一些参数,这些参数,在shell脚本内可以直接使用位置变量
获取。
位置变量为$
+数字
;数字
为几,则表示取第几个变量。
比如启动shell脚本时的命令为
./demo.sh para1 para2 para3
那么,在demo.sh
内,使用$1
就是取para1
,使用$3
就是取para3
。如果以上面的命令来启动demo.sh
,而demo.sh
的内容如下,则会在屏幕上输出para2
demo.sh:
echo $2
1.3 内部变量
内部变量,是一些Linux约定的被占用的符号。每个都有特殊的含义。
变量名 | 含义 |
---|---|
$# | 获取参数的数量 |
$? | 命令执行后的返回值 |
$0 | 脚本的名称,其实就是第0个输入参数 |
$* | 所有的参数,是一个整体的字符串 |
二 条件判断
条件判断,使用[]
或者[[]]
包裹需要进行判断的语句。[[]]
可以支持更加复杂的判断语句,比如正则表达式。对于不同类型的判断,有不同的运算符。
2.1 文件判断
文件判断的语句,基本用法是
运算符 需要判断的目标
具体的运算符如下
运算符 | 作用 |
---|---|
-e | 判断文件是否存在 |
-f | 判断是否为“普通文件”(前述文章已经介绍过普通文件的概念) |
-d | 是否为目录文件 |
-r | 是否可读 |
-w | 是否可写 |
-x | 是否可执行 |
比如我需要判断当前目录下的demo.sh
是否可执行,我们可以使用前述文章中提到的连接符&&
。当判断成功后,会向屏幕中输出1
[ -x ./demo.sh ] && echo 1
2.2 数字判断
其作用如同标题,用于判断两个数字的大小关系,提供了:大于
、小于
、等于
、不等于
、大于等于
、小于等于
。它的应用形式是
值1 运算符 值2
其各自的运算符如下:
运算符 | 作用 |
---|---|
-eq | 等于(equal) |
-ne | 不等于(not equal) |
-gt | 大于(great than) |
-lt | 小于(less than) |
-ge | 大于等于(greater than or equal to) |
-le | 小于等于(less than or equal to) |
2.2 字符串的比较
字符串的比较(判断),主要有:是否相等、是否为空。
运算符 | 作用 |
---|---|
= | 是否相等 |
-z | 是否为空 |
-n | 是否不为空 |
!= | 是否不相等 |
2.3 if语句
if
语句,用于判断某些条件是否达成,其应用模式是:
if [ 条件1 ]; then
条件1达成要做的事情
elif [ 条件2 ]; then
条件2达成需要做的事情
else
如果条件1和条件2都不达成,需要做的事情
fi
在上述命令中,elif
和 else
可以根据实际处理需要选择。可以不添加。最简单形式的if
语句为
if [ 条件1 ]; then
条件1达成要做的事情
fi
注意:中括号后面有分号,[]
里面有的条件和关键字之间有空格
三 实例实现
如文章开头所言,我们需要实现一个实例,作用为:
- 接受用户的两个输入
- 如果两个输入均为数字,则计算“输入1”和“输入2”的和,以及在他们中,大数与小数的差
- 如果有一个为普通字符串,则输出非数字的提示
- 如果第一个参数为文件,则输出文件内容
- 如果第一个参数为文件,且存在第二个参数,则向文件中增量写入第二个参数后,输出文件
其代码为
#!/bin/bash
echo my user:$USER
echo my home:$HOME
echo your first input:$1.
echo your second input:$2.
echo all para:$*.
if [[ $# -eq 0 ]]; then
echo "no para"
elif [[ $1 =~ ^[0-9]+$ && $2 =~ ^[0-9]+$ ]]; then
sum=$(($1+$2))
if [[ $1 -gt $2 ]]; then
dif=$(($1-$2))
else
dif=$(($2-$1))
fi
echo "dif:$dif"
echo "sum:$sum"
elif [[ -e $1 && -f $1 ]]; then
if [[ $# -eq 2 && -w $1 ]]; then
echo $2 >> $1
fi
echo "================file content=================="
cat $1
echo "=============================================="
echo "++++++++++++++++++++++++++++++++++++++++++++++"
else
echo "your input is not numb"
fi
分段解释:
- 声明shell的版本
#!/bin/bash
- 获取环境变量并输出到屏幕
echo my user:$USER echo my home:$HOME
- 获取用户输入的第1 第2个变量并输出到屏幕
echo your first input:$1. echo your second input:$2.
- 以单个字符串形式获取用户输入的所有参数并输出到屏幕
echo all para:$*.
- 判断用户是否输入了参数,如果没有输入参数,则输出提示
if [[ $# -eq 0 ]]; then echo "no para"
- 如果用户输入了参数,则使用正则表达式,判断第1和第2个参数是否为数字
6.1. 如果两个参数都是数字,则进行求和,并使用变量elif [[ $1 =~ ^[0-9]+$ && $2 =~ ^[0-9]+$ ]]; then
sum
记录和
6.2. 判断两个数字谁更大,使用更大的去减更小的,并使用变量sum=$(($1+$2))
dif
记录差
6.3. 先输出差,再输出和if [[ $1 -gt $2 ]]; then dif=$(($1-$2)) else dif=$(($2-$1))
echo "dif:$dif" echo "sum:$sum"
- 如果两个参数都不是数字,判断第一个参数是否为文件,如果是文件判断是否为普通文件
7.1. 如果参数1 是文件且是普通文件,那么判断是否有第二个参数,如果有第二个参数,判断参数1对应的文件是否可写elif [[ -e $1 && -f $1 ]]; then
7.1.1. 如果文件可写入,将参数2对应的内容增量写入参数1对应的文件if [[ $# -eq 2 && -w $1 ]]; then
7.2. 输出参数1文件的内容echo $2 >> $1
echo "================file content==================" cat $1 echo "==============================================" echo "++++++++++++++++++++++++++++++++++++++++++++++"
- 否则,输出非数字输入提示
echo "your input is not numb"
网友评论