嵌入式技术
Shell脚本并不能作为正式的编程语言,因为它是在Linux的shell中运行的,所以称为shell脚本。事实上,shell脚本就是一些命令的集合。比如,我想实现这样的操作:
# cd /usr/local/sbin/
# vim first.sh //加入如下内容
## This is my first shell script.
## Writen by Aming 2022-12-02.
date
echo "Hello world!"
shell脚本通常都以.sh为后缀名。这并不是说不加.sh的脚本就不能执行,只是大家的一个习惯而已。所以,以后如果发现了以.sh为后缀的文件,那么它可能是一个shell脚本。本例中,脚本文件first.sh的第1行要以#! /bin/bash开头,表示该文件使用的是bash语法。如果不设置该行,你的shell脚本也可以执行,但是不符合规范。#表示注释,后面跟一些该脚本的相关注释内容,以及作者、创建日期或者版本等。当然,这些注释并
# sh first.sh
Fri Dec 2 22:16:56 CST 2022
Hello world!
其实shell脚本还有一种执行方法,如下所示:
# ./first.sh
./first.sh: 权限不够
: # chmod +x first.sh
# ./first.sh
Fri Dec 2 2256 CST 2022
Hello world!
使用该方法运行shell脚本的前提是脚本本身有执行权限,所以需要给脚本加一个x权限。另外,使用sh命令执行一个shell脚本时,可以加-x选项来查看这个脚本的执行过程,这样有利于我们调试这个脚本。如下所示:
# sh -x first.sh
+ date
Fri Dec 2 2243 CST 2022
+ echo 'Hello world!'
Hello world!
本例中有一个date命令,之前阿铭从未介绍过,这个命令在shell脚本中使用非常频繁,因此有必要介绍一下它的用法。
date +"%Y-%m-%d %H:%M:%S"
2022-12-02 2203
有时,在脚本中会用到一天前的日期,如下所示:
date -d "-1 day" +%d
01
或者一小时前,如下所示:
date -d "-1 hour" +%H
21
甚至一分钟前,如下所示:
# date -d "-1 min" +%M
17
13.2 shell脚本中的变量
# vim variable.sh
#! /bin/bash
## In this script we will use variables.
## Writen by Aming 2022-12-02.
d=`date +%H:%M:%S`
echo "The script begin at $d."
echo "Now we'll sleep 2 seconds."
sleep 2
d1=`date +%H:%M:%S`
echo "The script end at $d1."
本例中使用到了反引号,它的作用是将引号中的字符串当成shell命令执行,返回命令的执行结果。d和d1在脚本中作为变量出现。下面来看看该脚本的执行结果,如下所示:
# sh variable.sh
The script begin at 2204.
Now we'll sleep 2 seconds.
The script end at 2206.
# vim sum.sh
## For get the sum of two numbers.
## Aming 2022-12-02.
a=1
b=2
sum=$[$a+$b]
echo "$a+$b=$sum"
数学计算要用[ ]括起来,并且前面要加符号$。该脚本的结果如下:
# sh sum.sh
1+2=3
13.2.2 和用户交互示例脚本如下:
# cat read.sh
## Using 'read' in shell script.
## Aming 2022-12-02.
read -p "Please input a number: " x
read -p "Please input another number: " y
sum=$[$x+$y]
echo "The sum of the two numbers is: $sum"
read命令用于和用户交互,它把用户输入的字符串作为变量值。该脚本的执行过程如下:
# sh read.sh
Please input a number: 2
Please input another number: 10
The sum of the two numbers is: 12
我们不妨加上-x选项再来看看这个执行过程:
# sh -x read.sh
+ read -p 'Please input a number: ' x
Please input a number: 22
+ read -p 'Please input another number: ' y
Please input another number: 13
+ sum=35
+ echo 'The sum of the two numbers is: 35'
The sum of the two numbers is: 35
13.2.3 shell脚本预设变量
# vim option.sh //内容如下
sum=$[$1+$2]
echo "sum=$sum"
该脚本的执行结果如下:
# sh -x option.sh 1 2
+ sum=3
+ echo sum=3
sum=3
echo "$1 $2 $0"
该脚本的执行结果如下:
# sh option.sh 1 2
1 2 option.sh
13.3 shell脚本中的逻辑判断
if 判断语句; then
command
fi
示例脚本如下:
# cat if1.sh
read -p "Please input your score: " a
if ((a<60)); then
echo "You didn't pass the exam."
fi
# sh if1.sh
Please input your score: 90
# sh if1.sh
Please input your score: 33
You didn't pass the exam.
13.3.2 带有else
if 判断语句; then
command
else
command
fi
示例脚本如下:
# vim if2.sh //内容如下
read -p "Please input your score: " a
if ((a<60)); then
echo "You didn't pass the exam."
else
echo "Good! You passed the exam."
fi
该脚本的执行结果如下:
# sh if2.sh
Please input your score: 80
You passed the exam.
# sh if2.sh
Please input your score: 25
You didn't pass the exam.
脚本if2.sh和脚本if1.sh唯一的区别是:如果输入大于或等于60的数字会有提示。
if 判断语句1; then
command
elif 判断语句2; then
command
else
command
fi
示例脚本如下:
# vim if3.sh //内容如下
read -p "Please input your score: " a
if ((a<60)); then
echo "You didn't pass the exam."
elif ((a>=60)) && ((a<85)); then
echo "Good! You pass the exam."
else
echo "Very good! Your score is very high!"
fi
这里的&&表示“并且”的意思,当然也可以使用||表示“或者”。
# sh if3.sh
Please input your score: 90
Very good! Your score is very high!
# sh if3.sh
Please input your score: 60
You pass the exam.
以上只是简单介绍了if语句的结构。判断数值大小除了可以用(())的形式外,还可以使用[]。但是不能使用>、<、=这样的符号了,要使用-lt (小于)、-gt(大于)、-le(小于或等于)、-ge(大于或等于)、-eq(等于)、-ne(不等于)。下面阿铭就以命令行的形式简单比较一下,不再写shell脚本。示例代码如下:
a=10; if [ $a -lt 5 ]; then echo ok; fi
a=10; if [ $a -gt 5 ]; then echo ok; fi
ok
a=10; if [ $a -ge 10 ]; then echo ok; fi
ok
a=10; if [ $a -eq 10 ]; then echo ok; fi
ok
a=10; if [ $a -ne 10 ]; then echo ok; fi
下面是在if语句中使用&&和||的情况,示例代码如下:
# a=10; if [ $a -lt 1 ] || [ $a -gt 5 ]; then echo ok; fi
ok
# a=10; if [ $a -gt 1 ] || [ $a -lt 10 ]; then echo ok; fi
ok
13.3.4 和文档相关的判断Shell脚本中if还经常用于判断文档的属性,比如判断是普通文件还是目录,判断文件是否有读、写、执行权限等。if常用的选项有以下几个。
if [ -e filename ] ; then
command
fi
示例代码如下:
if [ -d /home/ ]; then echo ok; fi
ok
if [ -f /home/ ]; then echo ok; fi
因为/home/是目录而非文件,所以并不会显示ok。其他示例如下所示:
# if [ -f /root/test.txt ]; then echo ok; fi
ok
# if [ -r /root/test.txt ]; then echo ok; fi
ok
# if [ -w /root/test.txt ]; then echo ok; fi
ok
# if [ -x /root/test.txt ]; then echo ok; fi
# if [ -e /root/test1.txt ]; then echo ok; fi
审核编辑:汤梓红全部0条评论
快来发表一下你的评论吧 !