文章目录
- Linux嵌入式开发——shell脚本
- 一、shell脚本基本原则
- 二、shell脚本语法
- 2.1、编写shell脚本
- 2.2、交互式shell脚本
- 2.3、shell脚本的数值计算
- 2.4、test命令
- &&运算符
- ||运算符
- 2.5、中括号[]判断符
- 2.6、默认变量
- 三、shell脚本条件判断
- if then
- if then else
- case
- 四、shell脚本函数
- 不带参数
- 带参数
- 五、shell循环
- while
- until
- for
Linux嵌入式开发——shell脚本
经过我们前面的学习,我们已经能够在终端中输入命令来完成一些常用的操作,但是都是一条一条地输入命令,如果需要执行的命令一旦多起来,就会很麻烦。那么有没有一种方式可以将很多条命令放到一个文件里面,然后直接运行这个文件便可执行这些命令?当然有,这就是我们接下来要介绍的shell脚本!
shell脚本类似windows的批处理文件,就是将连续执行的命令写成一个文件。shell脚本提供数组、循环、条件判断的等功能,一般是Linux运维或者系统管理员要掌握的,但作为嵌入式开发人员,我们只需要掌握shell脚本最基础的部分即可。
一、shell脚本基本原则
shell脚本是个纯文本文件,命令从上而下,一行一行的开始执行。shell脚本扩展名为.sh。而且shell脚本第一行一定要为:
代码语言:javascript复制#!/bin/bash
这个表示使用bash。
二、shell脚本语法
2.1、编写shell脚本
接下来,我们来编写第一个简单的shell脚本,主要功能就是在终端显示一下“hello world!”。我们接下来看一下具体的代码吧!
代码语言:javascript复制#!/bin/bash
echo "hello world!"
但是我们看一下这个.sh文件的权限吧!
代码语言:javascript复制-rw-rw-r-- 1 ygr ygr 32 1月 26 15:08 my.sh
我们可以看到,这个文件是不可执行的,于是我们修改一下权限,让他变成可执行文件。
代码语言:javascript复制chmod 777 my.sh
接下来,我们来执行一下这个文件,看一下最后的输出结果是什么。我们可以看到,最后输出了我们的“hello world!”。
代码语言:javascript复制ygr@ygr-virtual-machine:~/桌面$ ./my.sh
hello world!
2.2、交互式shell脚本
接下来,我们要接触的就是交互式脚本,我们已经学会在终端打印了,接下来我们来学习一下如何输入。我们使用的命令是read命令,接下来看一下我们的具体代码:
代码语言:javascript复制#!/bin/bash
echo "please input name:"
read name
echo "your name:" $name
然后运行效果:
代码语言:javascript复制please input name:
chenyi
your name: chenyi
我们的read命令可以加入许多的参数,我们只简单介绍一个,剩下的大家自己去看看。
代码语言:javascript复制#!/bin/bash
read -p "please input name and age: " name age
echo "your name = $name, your age = $age."
这个命令,就是用来输入的时候去提示用户的,我们看一下运行结果:
代码语言:javascript复制please input name and age: chenyi 30
your name = chenyi, your age = 30.
2.3、shell脚本的数值计算
shell仅支持整形,数值计算我们使用如下语句去进行:
代码语言:javascript复制#!/bin/bash
echo "please input two int num: "
read -p "first num: " first
read -p "second num: " second
total=$(($first $second))
echo "$first $second = $total"
运行结果:
代码语言:javascript复制please input two int num:
first num: 4
second num: 6
4 6 = 10
2.4、test命令
test命令主要用于查看文件是否存在、权限等信息,可以进行数值,字符,文件三方面的测试。在这之前,我们先介绍一下&&和||这两个命令:
&&运算符
我们知道,“&&”在C语言里面是与的意思,但是在shell语法里面,这个不是与的意思,但是有一点类似,我们接下来举个例子来看一下。
“cmd1 && cmd2” 的意思就是当cmd1执行完并且正确时,那么cmd2开始执行,如果cmd1执行错误,那么cmd2不执行。只能说有点像C语言里面的短路,接下来我们来介绍一下||运算符。
||运算符
我们知道,“||”在C语言里面是或的意思,但是在shell语法里面,这个不是或的意思,而是或者的意思,我们接下来举个例子来看一下。
“cmd1 || cmd2” 的意思就是当cmd1执行完毕并正确时,cmd2不执行,反之cmd2执行。就是两者执行其一,所以我说是或者的意思。而且这两个命令一般都是结合在一起使用的。
接下来,我们来看一看test命令的具体使用方法吧!
代码语言:javascript复制#!/bin/bash
read -p "please input file name: " filename
test -e $filename && echo "$filename exist" || echo "$filename no exist"
运行结果:
代码语言:javascript复制please input file name: C-test
C-test exist
这个是来查看文件是否存在,我们接下来看一看字符串的判断:
代码语言:javascript复制#!/bin/bash
echo "please input two string: "
read -p "first string: " first
read -p "second string: " second
test $first == $second && echo "equality" || echo "inequality"
运行结果:
代码语言:javascript复制please input two string:
first string: qwert
second string: qwert
equality
please input two string:
first string: qwe
second string: asd
inequality
2.5、中括号[]判断符
[ ]判断符,顾名思义,就是用来判断的,但是里面只能输入 ==或 !=,接下来我们来看一下具体的使用方法:
代码语言:javascript复制#!/bin/bash
echo "please input two string: "
read -p "first string: " first
read -p "second string: " second
[ "$first" == "$second" ] && echo "equality" || echo "inequality"
这个命令与上面那个命令是等价的。但是要注意,变量要加上双引号。
2.6、默认变量
我们接下来介绍一下默认变量,接下来我们来看一些默认变量:
- 0 ~ n,表示shell脚本的参数,包括shell脚本命令本身,shlle脚本命令本身为
- $#:#表示最后一个参数的标号。
- @:表1、2、3…
我们来看一下具体的代码:
代码语言:javascript复制#!/bin/bash
echo "file name:" $0
echo "total parameter num: " $#
echo "all paramenters: " $@
echo "first paramenters: " $1
echo "second paramenters: " $2
运行结果:
代码语言:javascript复制ygr@ygr-virtual-machine:~/桌面$ ./my.sh qw er rt
file name: ./my.sh
total parameter num: 3
all paramenters: qw er rt
first paramenters: qw
second paramenters: er
三、shell脚本条件判断
if then
我们的shell脚本虽然可以通过&&和||来实现简单的条件判断,但是稍微复杂一点的场景就不适合了。所以shell脚本为我们提供了if then条件判断语句,写法如下所示,我们来看一下具体的代码使用:
代码语言:javascript复制if 条件判断 ; then
//判断成立要做的事情
fi
代码语言:javascript复制 1 #!/bin/bash
2
3 read -p "please input(Y/N): " value
4 if [ "$value" == "Y" ] || [ "$value" == "y" ]; then
5 echo "your input is Y !"
6 exit 0
7 fi
8
9 if [ "$value" == "N" ] || [ "$value" == "n" ]; then
10 echo "your input is N !"
11 exit 0
12 fi
运行结果如下所示:
代码语言:javascript复制ygr@ygr-virtual-machine:~/桌面$ ./my.sh
please input(Y/N): y
your input is Y !
ygr@ygr-virtual-machine:~/桌面$ ./my.sh
please input(Y/N): n
your input is N !
if then else
除了if then之外,我们还有if then else 语句,就类似于C语言里面的if else,具体的写法如下所示:
代码语言:javascript复制if 条件判断 ; then
//条件判断成立要做的事情
else
//条件判断不成立要做的事情。
fi
或:
if 条件判断 ; then
//条件判断成立要做的事情
elif [条件判断]; then
//条件判断成立要做的事情
else
//条件判断不成立要做的事情。
fi
我们来看一下具体的代码:
代码语言:javascript复制 1 #!/bin/bash
2
3 read -p "please input(Y/N): " value
4 if [ "$value" == "Y" ] || [ "$value" == "y" ]; then
5 echo "your input is Y !"
6 exit 0
7 else
8 echo "your input is: $value !"
9 exit 0
10 fi
运行结果如下所示:
代码语言:javascript复制please input(Y/N): t
your input is: t !
please input(Y/N): y
your input is Y !
接下来是elif,我们来看看具体的使用代码:
代码语言:javascript复制 1 #!/bin/bash
2
3 read -p "please input(Y/N): " value
4 if [ "$value" == "Y" ] || [ "$value" == "y" ]; then
5 echo "your input is Y !"
6 exit 0
7 elif [ "$value" == "N" ] || [ "$value" == "n" ]; then
8 echo "your input is: $value !"
9 exit 0
10 else
11 echo "your input is not recognized!"
12 fi
运行结果:
代码语言:javascript复制please input(Y/N): r
your input is not recognized!
please input(Y/N): y
your input is Y !
please input(Y/N): n
your input is: n !
case
接下来我们来介绍一下case语句,这个与我们在C语言里面的case是类似的,具体的写法如下所示:
代码语言:javascript复制case $变量 in
“第1个变量内容”)
程序段
;; # 表示该程序块结束!!
“第2个变量内容”)
程序段
;;
“第n个变量内容”)
程序段
;;
esac
接下来我们来看一看具体的代码实现:
代码语言:javascript复制 1 #!/bin/bash
2
3 case $1 in
4 "chen")
5 echo "chen yi is my baby!"
6 ;;
7 "ye")
8 echo "ye! happy every day!"
9 ;;
10 *)
11 echo "your input is not recognized!"
12 ;;
13 esac
运行结果如下所示:
代码语言:javascript复制ygr@ygr-virtual-machine:~/桌面$ ./my.sh ye
ye! happy every day!
ygr@ygr-virtual-machine:~/桌面$ ./my.sh chen
chen yi is my baby!
ygr@ygr-virtual-machine:~/桌面$ ./my.sh chr
your input is not recognized!
四、shell脚本函数
不带参数
shell脚本也是支持函数的,不带参数的函数写法如下:
代码语言:javascript复制function fname () {
# 函数代码段
}
具体的代码如下所示:
代码语言:javascript复制 1 #!/bin/bash
2
3 function help(){
4 echo "this is help cmd!"
5 }
6
7 function close(){
8 echo "this is close cmd!"
9 }
10
11 case $1 in
12 "-h")
13 help
14 ;;
15 "-c")
16 close
17 ;;
18 esac
运行结果如下所示:
代码语言:javascript复制ygr@ygr-virtual-machine:~/桌面$ ./my.sh -h
this is help cmd!
ygr@ygr-virtual-machine:~/桌面$ ./my.sh -c
this is close cmd!
带参数
接下来我们来介绍一下函数带参数的情况,具体的写法如下所示:
代码语言:javascript复制 1 #!/bin/bash
2
3 print(){
4 echo "parameter 1:$1!"
5 echo "parameter 2:$2!"
6 }
7
8 print chen ye
运行结果如下所示:
代码语言:javascript复制parameter 1:chen!
parameter 2:ye!
五、shell循环
while
shell脚本也支持循环,比如 while do done,表示当条件成立的时候就一直循环,直到条件不成立,具体的语法格式如下所示:
代码语言:javascript复制while [条件] # 括号内的状态是判断式
do # 循环开始
# 循环代码段
done
具体的实现代码如下所示:
代码语言:javascript复制 1 #!/bin/bash
2
3 while [ "$value" != "close" ]
4 do
5 read -p "please input str:" value
6 done
7
8 echo "stop while!!!"
运行结果如下所示:
代码语言:javascript复制please input str:er
please input str:stop
please input str:close
stop while!!!
until
还有另外一种until do done,表示条件不成立的时候循环,条件成立以后就不循环了,具体的语法格式如下所示:
代码语言:javascript复制until [条件]
do
//循环代码段
done
具体的实现代码如下所示:
代码语言:javascript复制 1 #!/bin/bash
2
3 until [ "$value" == "close" ]
4 do
5 read -p "please input str:" value
6 done
7
8 echo "stop while!!!"
运行结果如下所示:
代码语言:javascript复制please input str:co
please input str:close
stop while!!!
for
shell脚本的for循环和python的for非常类似,其实就是因为python其实也算是脚本语言,使用for循环可以知道有循环次数,具体的语法格式如下所示:
代码语言:javascript复制for var in con1 con2 con3……
do
# 循环代码段
done
#for循环数值处理,写法
for((初始值; 限制值; 执行步长))
do
# 循环代码段
done
具体的语法实现如下所示:
代码语言:javascript复制 1 #!/bin/bash
2
3 for name in ygr cy
4 do
5 echo "your name is :$name!"
6 done
运行结果如下所示:
代码语言:javascript复制your name is :ygr!
your name is :cy!
接下来我们看一下另外一个for循环:
代码语言:javascript复制 1 #!/bin/bash
2
3 read -p "please input count: " count
4
5 total=0
6 for((i=0; i<=count; i=i 1))
7 do
8 total=$(($total $i))
9 done
10
11 echo "前n个整数之和为: $total"
运行结果如下所示:
代码语言:javascript复制please input count: 5
前n个整数之和为: 15