嵌入式之Shell学习
shell是一种脚本语言,和C语言一样都是为了完成某些功能,但是shell语言和C语言也有不同的地方,首先是shell不用编译,源代码直接解释执行,就是编写源代码之后,可以直接执行,不用像C语言那样,必须编译成可执行程序,才能够执行。下面对shell语言进行简单的讲解,目的在于能看懂嵌入式中所涉及的shell程序,能够自己改写,不要求完全自己掌握shell语言。
一、shell语言的编写格式。
1 #!/bin/sh
2 #comment
3
4 echo "hello shell."
5
第一行代表的含义:指定shell程序执行的时候被哪个解释器解释执行,也就是这个shell程序将来被当前机器中/bin目录下的sh可执行程序执行。
shell中的#后面的东西,代表注释的意思,而且shell中只用这个单行注释命令“#”。
二、shell程序的执行方法
1、可以像执行可执行程序一样,使用./xxx.sh格式来执行shell程序。
2、使用source xx.sh 来执行程序,source是用来执行脚本程序的命令。
3、使用bash xx.sh来执行程序,bash是解释器,脚本程序解释器,一个可执行的程序,shell程序就相当于这个可执行程序的输入参数。
三、shell中变量的定义、初始化、赋值以及变量的引用
1、变量的定义以及初始化
1 #!/bin/sh
2 #comment
3
4 string="hello varible" #变量的定义,以及初始化,必须注意等号两边不能有空格,一定不能有
5 echo $string #变量的引用,必须使用$符号
注意:(1)shell是一种弱类型的语言,所以不像C语言那样,用严格的变量的类型。
(2)shell中变量的引用有两种方式
string="hell shell"
echo $string
echo ${string}hahaha
从这个例子中,我们很容易能够看到两者的区别。
2、shell中没有引号、单引号以及双引号的区别
1 #!/bin/sh
2 #comment
3
4 echo hello shell
5 echo "hello shell"
6 echo 'hello shell'
7 #上面三句的输出是相同的,没有任何的区别
8
9 echo "hello \" shell"
10 echo 'hello " shell'
11 echo hello \" shell
12 #上面的三句,也是可以输出双引号的
13
14 string="hello shell"
15
16 echo "output is $string" #这句代码会输出string的值
17 echo 'output is $string' #这句代码不会输出string的值,而是输出$string
18 echo output is $string #这句代码会输出string的值
19
20
从中可以看到,单引号是完全的按照字面意思输出,里面有什么就输出什么。双引号是可以输出变量对应的数值的。
3、shell中调用Linux的命令
(1)直接执行
(2)反引号将命令括起来执行。反引号为“ESC”下的按键。
1 #!/bin/bash
2 #comment
3
4 com=`pwd`
5 echo "pathname is $com"
6
7
这段代码的输出:pathname is /mnt/hgfs/winshare/x210/shell
目的就是为了获取,命令执行后的返回值。
四、shell中的分支结构if语句
1、格式
if [ 表达式 ]; then
xxxxx
else
xxxx
fi
注意表达式的前后和if关键字之后,都是有一个空格的,这个是必须的,不然是错误的。
2、判断条件的格式
(1)判断一个文件是否存在:-f xxxx
1 #!/bin/sh
2
3
4
5 if [ -f lesson1.sh ];then
6 echo "yes"
7 else
8 echo "no"
9 fi
(2)判断目录时候存在:-d xxxx
用法和判断文件存在是相同的。
(3)判断字符串是否相等:"xxx"= "yyyy"
1 #!/bin/sh
2
3
4
5 if [ "abc" = "abc" ];then
6 echo equal
7 else
8 echo no
9 fi
(4)判断数字是否相等(-eq)、大于(-gt)、小于(-lt)、大于等于(-ge)、小于等于(-le)
1 #!/bin/sh
2
3
4
5 if [ 8 -gt 0 ];then
6 echo yes
7 else
8 echo no
9 fi
1 #!/bin/sh
2
3
4
5 if [ 8 -lt 0 ];then
6 echo yes
7 else
8 echo no
9 fi
1 #!/bin/sh
2
3
4
5 if [ 8 -eq 0 ];then
6 echo yes
7 else
8 echo no
9 fi
note:
gt:great than
lt:less than
ge:great or equal
le:less or equal
(5)判断字符串是否为空:-z
1 #!/bin/sh
2
3 string=""
4 if [ -z $string ];then
5 echo kong
6 else
7 echo not kong
8 fi
(6)shell中的逻辑或:-o
(7)逻辑&&、||的含义,if表达式的简写
例如:
1 #!/bin/sh
2
3 string="hello"
4 [ -z $string ] || echo kong
表示:如果 前面一条语句为真的话,那么就不会执行后面的语句,如果前面的语句为假的话,就会执行后面的语句。逻辑与指令也是相同的,如果前面一条语句为假的话,那么后面的语句就不用执行了,如果为真的话,才执行后面的语句。
五、shell中的循环语句:for循环和while循环
1、for循环的格式
1 #!/bin/sh
2
3
4 for i in 1 2 3 4 5
5 do
6 echo $i
7 done
8
9
输出为: 1 2 3 4 5
9 cmd=`ls`
10 for i in $cmd
11 do
12 echo $i
13 done
14
这里会将ls输出的结果,一条一条的输出,也就是将ls命令显示的结果,打印出来。
2、while循环
1 #!/bin/sh
2
3 i=10
4 j=0
5 while [ $i -gt $j ];do
6 echo $i
7 i=$(($i - 1)) #这句代码相当于C语言中的i++,格式必须这样。
8 done
六、shell中其他几点需要注意的地方
1、shell中的case语句,和C语言中的switch case 语句是相同的作用
1 #!/bin/sh
2
3 var=1
4 case $var in
5 1) echo 1 ;;
6 2) echo 2 ;;
7 3) echo 3 ;;
8
9 esac
shell中的case是不用带break语句的,默认是执行一个case之后,就推出了,所以需要注意在shell语言中,break只是用来跳出循环语句的。当case语句和while循环一起使用的时候,要特别注意了。
2、shell程序中传参机制
(1)参数个数,以及具体的参数
$#:代表实际传递的参数的个数,不同于C语言中传参机制。
$0:执行这个shell程序的解析程序的名字
$1:代表第一个真正的有效参数
...
(2)这里的参数个数和具体的参数,是可以通过shift指令改变的。没使用一次shift指令,参数个数减1,传递的参数向左移动一个。第二个参数变为第一个参数,以此类推。
3、echo的创建文件和追加输入文件
1 #!/bin/sh
2
3 echo "hello echo" > hello.txt # >表示创建文件,并想文件中添加内容hello echo
4
5 echo "hello zhuijia" >> hello.txt # >>表示向已存在的文件中追加内容hello zhuijia
6
7