从零开始的UBOOT的学习2--shell的简单知识

从零开始的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语言中是相同的,也有很多是不同的。

猜你喜欢

转载自blog.csdn.net/dhauwd/article/details/80030848