从零开始的UBOOT的学习2--shell的简单知识
参考朱有鹏的UBOOT全集
为什么我们要使用shell?因为shell里面的命令都可以在Linux下的命令行中执行,为啥我们需要使用shell,然后再命令行中执行它?因为我们需要用它批量的执行一些操作。这样我们就不会每次都重复的在命令行中敲命令。
1、shell变量的定义
(1)shell是一种脚本语言(语言中的变量如果有明确的类型,属于强类型语言),和C语言不同。shell编程中,定义变量不需要指令类型,也没有类型这个概念。
(2)变量定义可以初始化,使用等号进行初始化赋值。在shell里面的赋值的=两边是不能有空格的,C语言没有这样的规定。
注意:shell对于语法是十分的在意,非常严格,很多地方空格都是必须没有或者必须有。
(3)变量赋值和引用
变量定义后可以再次给他赋值,新的赋值会覆盖老的赋值。
shell中并不刻意区分变量的定义和赋值,反正每个变量就是一个符号,这个符号的值就是最后一个给他赋值的值。
shell中引用一个变量必须使用$符号。
注意:$符号后面跟一个字符串,这个字符串就会被当作变量去解析,如果字符串本身没有定义,执行时并不会报错,而是把这个变量解析为空。也就是说在shell中没有被定义的变量就是空
例子:
var="hello world"
echo $var
echo $var1 #此时不会输出任何的东西,因为没有定义变量var1
2、shell里面的无引号,单引号,和双引号
(1)shell里面添加特殊字符,那么就一定需要双引号了
shell中直接使用字符串可以不加双引号,直接使用,而且空格也是可以的。缺陷是不能输出其他的字符。
(2)shell中的转义字符:
\$表示$的字面值
\'表示'的字面值
\"表示"的字面值
\表示\的字面值
(3)shell可以直接调用命令
PWD=`pwd`
echo $PWD
这时候反引号引起来就是一个Linux命令,执行的结果就是一个Linux的命令。
这时候如果使用单引号的话:
PWD='pwd'
echo $PWD
就是输出pwd
3、shell中的选择分支结构
(1)shell if语句
在此只介绍常用的,其他感兴趣可以自己学习。
if [表达式]; then
XXX
else
XXX
fi
(2)if的典型应用
判断文件是否存在
-f 判断文件是否存在,要注意我们[]里面前后都有空格,不能省略
if [ -f a.c ]; then
echo "yes"
else
echo "no"
fi
判断目录是否存在?
-d
判断字符串是否相等?
"str1" = "str2"注意用一个等号而不是使用两个
在C语言中是使用两个等号判断字符串是否相等
shell里面只有一个等号的
判断数字是否相等的关系:
-eq:相等
-gt:大于
-lt:小于
-ge:是大于等于
判断字符串是否为空:
-z
(2)if判断式中使用"-o"表示逻辑或相当于C语言中在if后面的条件式中用逻辑与,逻辑或来连接2个式子的,最终的if中是否成立取决于2个式子的逻辑运算的结果。
(3)逻辑与&&和逻辑或||符号
简写的if 表达式,只有中括号。
[ -z $str ] || echo "fei kong"
逻辑或式子。如果str这个表达式真的为空
竟然不成立,这个变量没有定义的话,也是不成立的。
注意-z判断时,如果变量本身没定义也是不成立的。
就是说-z认为没定义不等于为空。
UBOOT中的实例分析:
[ "${BOARD NAME}" ] || BOARD_NAME="$1"
此句话表达的意思就是:
如果BOARD NAME的名字不为空的话,那么就保留原来的值,
如果BOARD NAME的名字为空的话,那么就赋值为第1个参数的值。
注意,变量引用的时候,可以使用$var,也可以使用${var}
4、shell中的while循环语句
i=1
j=11
while [ $i -lt $j ]; do
echo $i
i= $(($i+1)) //shell格式是比较恶心
done
5、shell中还有需要注意的地方
(1)echo的创建和追加输入文件
1/在shell中可以直接使用echo指令新建一个文件,并且将一些内容传入文件中。
2/echo指令创建文件和追加输入文件:
echo "test" > a.txt
在这里面追加一个很简单的C语言文件。
3/创建一个C语言的程序,这就是我们说的创建文件。
创建文件并输入内容的关键。
echo指令向已经存在的文件追加输入内容。
echo "追加的内容" >> a.c
(2)case语句
var=2
case $var in
1) echo "1" ;;
2) echo "2" ;;
esac
(3)调用shell程序进行传参
1、C语言中可以通过main函数的argc,和argv里面传参。就是为了让我们的程序更加的灵活;
2、shell程序本身也可以在调用时传参给他。在我们的shell程序内部也是使用一些特定符号来表示的:
包括:
$#表示调用该shell时传参的个数。
$0 $1 $2则依次表示传参的各个参数。
C语言:./a.out aa bb cc argc = 4, argv[0] = ./a.out
shell:source a.sh aa bb cc
$0是执行这shell程序的解析程序的名字,$1是第一个有效参数的值,$2是第2个有效参数的值。
注意:shell中的很多语法特性和C语言中是相同的,也有很多是不同的。