Uboot7之shell语法

1.shell脚本

1.1使用shell脚本的原因

    ---功能强大

    ---节约时间

1.2 shell脚本基本元素    #!/bin/bash

1.3注意初学者易犯错误:

1) 第一行#不是注释 其他#都是注释;

2) echo $mytextA    写错现象;

3) #!/bin/bash        写错现象;    

4) 脚本如果没有执行权限 chmod 777 hello.sh,如何办

5) chmod u+x hello.sh          chmod u-x hello.sh

1.4 shell脚本运行方式

./shell.sh     source shell.sh

2.shell特性

3. shell语法

3.1 变量的定义与引用

1)变量定义和初始化。shell是弱类型语言(语言中的变量如果有明确的类型则属于强类型语言;变量没有明确类型就是弱类型语言),和C语言不同。在shell编程中定义变量不需要制定类型,也没有类型这个概念。

2)变量定义时可以初始化,使用=进行初始化赋值。在shell中赋值的=两边是不能有空格的。

注意:shell对语法非常在意,非常严格。很多地方空格都是必须没有或者必须有,而且不能随意有没有空格。

3)变量赋值,变量定义后可以再次赋值,新的赋值会覆盖老的赋值。shell中并不刻意区分变量的定义和赋值,反正每个变量就是一个符号,这个符号的值就是最后一个给他赋值时的值。

4)变量引用。shell中引用一个变量必须使用$符号,$符号就是变量解引用符号。

注意:$符号后面跟一个字符串,这个字符串就会被当作变量去解析。如果这个字符串本身没有定义,执行时并不会报错,而是把这个变量解析为空。也就是说在shell中没有被定义的变量其实就相当于是一个定义并赋值为空的变量。

注意:变量引用的时候可以$var,也可以${var}。这两种的区别是在某些情况下只能用${var}而不能简单的$var

仔细思考本地变量背后的含义! echo $MYV 每登录一个终端,都会运行一个shell程序,这个本地变量,就保存在这个shell程序中;如果再新登录,将启动新的shell程序,与原来的shell不同。

3.2 引号的作用

反引号括起来执行。有时候我们在shell中调用linux命令是为了得到这个命令的返回值(结果值),这时候就适合用一对反引号(键盘上ESC按键下面的那个按键,和~在一个按键上)来调用执行命令。

PWD=`pwd`

echo $PWD

3.3 表达式类型与表达式替换

3.4 shell的输入和输出

echo的创建和追加输入文件

1)在shell中可以直接使用echo指令新建一个文件,并且将一些内容传入这个文件中。创建文件并输入内容的关键就是>。

2)还可以使用echo指令配合追加符号>> 向一个已经存在的文件末尾追加输入内容。

echo "#include <stdio.h>

int main()

{

printf("hello word!\n");

return 0;

}" > a.c

echo "//hello" >> a.c

3.5 if then else语句

1)shell的if语言用法很多,在此只介绍常用的,其他感兴趣可以自己去学

2)典型if语言格式

if [表达式]; then

    xxx

    yyy

    zzz

else

    xxx

    ddd

    uuu

fi

3)if的典型应用

判断文件是否存在。(-f),注意[]里面前后都有空格,不能省略。

判断目录是否存在 (-d)

判断字符串是否相等("str1" = "str2"),注意用一个等号而不是两个

判断数字是否相等(-eq)、大于(-gt)、小于(-lt)、大于等于(-ge)、小于等于(-le)        回忆一下在ARM裸机中讲述ARM汇编条件执行时,曾经用过这些条件判断的缩写。(eq就是equal,gt就是greater than,lt就是less than,ge就是greater or equal,le就是less or equal)

判断字符串是否为空(-z)注意-z判断时如果变量本身没定义也是不成立(也就是说-z认为没定义不等于为空

str="a"

if [ -z $str ];then

echo "yes"

else

echo "no"

fi

#if [ "abc" = "ab" ];then

# echo "equal"

#else

# echo "unequal"

#fi

#if [ -f a.c ];then

# echo "yes"

#else

# echo "no"

# touch a.c

#fi

4)if判断式中使用"-o"表示逻辑或

相当于C语言中在if后面的条件式中用逻辑与、逻辑或来连接2个式子,最终的if中是否成立取决于2个式子的逻辑运算结果。

if [ 12 -eq 1 -o "abd" = "abcd" ];then

echo "yes"

else

echo "no"

fi

5)逻辑与&&和逻辑或||与简写的if表达式相结合

要注意下优先级,比如下述的或运算符,第一个[]为假,就执行||后面的,如果为真就不执行||后面的

str="abc"

[ -z $str ] || echo "not empty"

    &&的意思是:如果[]是真就执行&&后面的,如果是假就不执行。

str=""

[ -z $str ] && echo "not empty"

3.6 for循环

要求:能看懂、能改即可。不要求能够完全不参考写出来。因为毕竟嵌入式并不需要完全重新手写shell,系统管理员(服务器运维人员,应用层系统级管理开发的才需要完全掌握shell)

for i in 1 2 3 4 5 6 7 8

do

echo $i

done

for i in `ls`

do

echo $i

done

3.7while循环

1)和C语言的循环在逻辑上无差别

2)要注意很多格式要求,譬如:while后面的[]两边都有空格,[]后面有分号,也可以没分号(如果do放在新一行的话),i++的写法中有两层括号。

i=1

j=11

while [ $i -lt $ ]; do

echo $i

i=$(($i+1))

done

3.8 echo的创建和追加输入文件

  1. 在shell中可以直接使用echo指令新建一个文件,并且将一些内容传入这个文件中。创建文件并输入内容的关键就是>。
  2. 还可以使用echo指令配合追加符号>> 向一个已经存在的文件末尾追加输入内容。

echo "#include <stdio.h>

int main()

{

printf("hello word!\n");

return 0;

}" > a.c

echo "//hello" >> a.c

  1. case语句

1)shell中的case语句和C语言中的switch case语句作用一样,格式有差异

2)shell中的case语句天生没有break,也不需要break,和C语言中的switch case不同。shell中的case默认就是匹配上哪个执行哪个,不会说执行完了还去执行后面的其他case(就好像shell中的case语言默认都带了break)。

var=2

case $var in

1) echo "1" ;;

2) echo "2" ;;

esac

3.10 调用shell程序的传参

1)C语言中可以通过main函数的argc和argv给程序传参(详情参考《4.8.3.argc、argv与main函数的传参》)

2)shell程序本身也可以在调用时传参给他。在shell程序内部使用传参也是使用的一些特定符号来表示的,包括:

$#表示调用该shell时传参的个数。($#计数时只考虑真正的参数个数)

$0、$1、$2•••••则依次表示传参的各个参数。

C语言:./a.out aa bb cc     argc = 4, argv[0] = ./a.out, argv[1]是第一个有效参数••••

shell:source a.sh aa bb cc $# = 3, $0是执行这个shell程序的解析程序的名字,$1是第一个有效参数的值,$2是第2个有效参数的值•••••

注意:shell中的很多语法特性和C语言中是相同的,也有很多是不同的。所以大家学的越多越容易混淆(本质原因还是用的不熟悉,用的少),解决方案是:做笔记、作总结、多写代码经常用

3.11while循环和case语言和传参结合

1)shell中的break关键字和C语言中意义相同(都是跳出)但是用法不同。因为shell中case语句默认不用break的,因此在shell中break只用于循环跳出。所以当while中内嵌case语句时,case中的break是跳出外层的while循环的,不是用来跳出case语句的。

2)shell中的$# $1等内置变量的值不是不可变的,而是可以被改变,被shift指令改变。shift指令有点像左移运算符,把我们给shell程序的传参左移了一个移出去了,原来的$2变成了新的$1,原来的$#少了1个。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值