最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

嵌入式linux系统-02-shell编程

XAMPP案例 admin 652浏览 0评论

每日心灵鸡汤:

将军百战死,壮士十年归,用我有限的生命去创造无限的价值。生命的永恒就是为了热爱的事业付出终生的努力,我终将成为我信仰的人。-fq

es0008

一、测试语句。

1、什么是测试语句?

其实测试语句就是比较两个值(整数/字符串)是否相等/大于/小于/一致,类似于C语言中 > < == != strcmp()

 

2、测试语句需要使用一个命令。  -> test  -> man 1 test

功能:test – check file types and compare values

//检查文件的类型与比较一些值

 

使用格式:

test EXPRESSION   等价于  test 判断表达式

等价于                    等价于

[ EXPRESSION ]    等价于  [ 判断表达式 ]

 

STRING1 = STRING2

the strings are equal   -> 测试一下字符串1是否与字符串2相等。

 

STRING1 != STRING2

the strings are not equal  -> 测试一下字符串1是否与字符串2不相等。

 

INTEGER1 -eq INTEGER2

INTEGER1 is equal to INTEGER2  -> 测试两个整数是否相等。

 

INTEGER1 -ge INTEGER2

INTEGER1 is greater than or equal to INTEGER2  测试整数1是否大于等于整数2

 

INTEGER1 -gt INTEGER2

INTEGER1 is greater than INTEGER2  测试整数1是否大于整数2

 

INTEGER1 -le INTEGER2

INTEGER1 is less than or equal to INTEGER2   测试整数1是否小于等于整数2

 

INTEGER1 -lt INTEGER2

INTEGER1 is less than INTEGER2   测试整数1是否小于整数2

 

INTEGER1 -ne INTEGER2

INTEGER1 is not equal to INTEGER2    -> 测试两个整数是否不相等。

 

-e FILE

FILE exists   -> 测试文件是否存在

 

-f FILE

FILE exists and is a regular file  -> 测试文件是否存在,并且是一个普通文件。

 

-r FILE

FILE exists and read permission is granted   -> 测试文件是否存在并且是否有读权限。

 

-w FILE

FILE exists and write permission is granted   -> 测试文件是否存在并且是否有写权限。

 

-x FILE

FILE exists and execute (or search) permission is granted   -> 测试文件是否存在并且是否有执行权限。

 

二、分支结构  — if-else分支

C语言:if-else分支  switch分支

shell:if-else分支  case分支

 

1、shell中的if-else框架。

C语言:

if(判断表达式1)

{

xxxx

xxxx

}

else if(判断表达式2)

{

yyyy

yyyy

}

else{

zzzz

zzzz

}

 

shell:

if 判断表达式1(其实就是测试语句)

then

xxxx

xxxx

elif 判断表达式2(其实就是测试语句)

then

yyyy

yyyy

else-> 既不满足条件1,也不满足条件2

zzzz

zzzz

fi

 

例题1:判断命令行额外的参数是不是为2个,如果不是2个则输出一个字符串报错。

$#

=====================================

#!/bin/bash

 

if test $# -ne 2

then

echo “input arg error!”

fi

=====================================

 

或者:

 

=====================================

#!/bin/bash

 

if [ $# -ne 2 ]

then

echo “input arg error”

fi

======================================

 

2、总结注意事项:

1)测试语句[]两边都必须有空格。

2)每一个if语句都会以fi作为结束标志。

3)if后面判断条件必须是真(0)时,then后面的语句才会被执行

4)else后面没有then。

 

练习1:使用命令行来传递文件路径。例如:./xxx.sh 1.txt。如果额外的参数不等于1个,则输出字符串”input arg error”报错。然后判断该文件是否存在,如果存在,则在终端上输出文件的内容。如果存在,但是没有读的权限,则先给文件添加读权限,然后再输出文件的内容,如果文件不存在,则输出一个字符串”file not exists”报错。

 

#!/bin/bash

 

if test $# -ne 1

then

echo “input arg error”

exit

fi

 

if [ -r $1 ]

then

cat $1

elif [ -e $1 ]

then

chmod 777 $1

cat $1

else

echo “file not exists”

fi

 

 

三、分支结构。—  case分支。

1、 case分支框架。

C语言:

switch(变量)

{

case x:

xxxx;

break;

case y:

yyyy;

break;

case z:

zzzz;

break;

default:

kkkk;

break;

}

 

shell:

case 引用变量 in

x)   xxxx;;

y)   yyyy;;

z)   zzzz;;

*)   kkkk;;

esac

 

2、拓展:从键盘中获取数据。

C语言:

char A[10];

scanf(“%s”,A);

 

shell:   -> 使用read命令

read a   -> 阻塞从键盘中获取内容,存放在变量a中。

 

例题2:执行程序后,从键盘获取一个值,如果该值为1,则打印one,如果该值为10,则打印ten,如果都不是,则打印error。

 

 

#!/bin/bash

 

read a

 

case $a in

1) echo “one”;;

10) echo “ten”;;

*) echo “error”;;

esac

 

练习2:假设有一个文件名字叫test.txt,里面的内容是10。现在要求你写一个程序,判断文件的内容。

内容为10,则打印large。

内容为5,则打印middle。

内容为1,则打印small。

请使用shell与C语言完成以上的题目。

 

shell:

#!/bin/bash

 

val=”`cat $1`”

 

case $val in

10) echo “large”;;

5) echo “middle”;;

1) echo “small”;;

*) echo “error”;;

esac

 

C语言:

int main(int argc,char *argv[])  //./p2 test.txt

{

//1. 打开文件

int fd;

fd = open(argv[1],O_RDONLY);

//2. 读取文件的内容出来

char buf[100] = {0};

read(fd,buf,sizeof(buf));  //10

//3. 将字符串10转换成数字10

int a = atoi(buf);

//4. switch分支去判断。

switch(a)

{

}

}

 

四、循环结构。  —  while循环。

C语言:for循环,while循环,do-while循环。

shell:for循环,while循环,until循环。

 

1、while循环结构。

C语言:

while(判定条件)

{

//循环体

…..

 

}

 

shell:

while 判定条件(测试语句)

do

//循环体

….

done

 

2、在shell中处理整型数据。

str  -> 默认都是字符串类型

 

==========================

#!/bin/bash

 

str=100

str=$str+1

echo $str

 

结果:100+1

===========================

 

declare -i str  -> 整型变量

 

=====================

#!/bin/bash

 

declare -i str=100

str=$str+1

echo $str

 

结果:101

 

======================

 

练习3:使用while循环打印1~100的值。

 

#!/bin/bash

 

declare -i n=1

 

while [ $n -le 100 ]

do

echo $n

n=$n+1

done

 

练习4:研究while循环的死循环怎么写?

 

#!/bin/bash

 

declare -i n=1

while [ $n -eq 1 ]

do

echo “hello”

done

 

五、循环结构。  — until循环。

与while循环非常相似。

while循环   -> 当判定条件成立时,就执行循环体的内容,当判定条件不成立时,就结束循环。

until循环   -> 当判定条件不成立时,就执行循环体的内容,当判定条件成立时,就结束循环。

 

until框架:

until 判定条件(测试语句)

do

//循环体

done

 

例题3:使用until循环来打印1~100的值。

 

#!/bin/bash

 

declare -i n=1

 

until [ $n -gt 100 ]

do

echo $n

n=$n+1

done

 

六、循环结构。  — for循环

1、for循环框架。

for 变量 in 一堆内容(使用空格分开)

do

//循环体

done

 

2、举例子。

#!/bin/bash

 

str=”hello world apple tree”

 

for s in $str

do

echo $s

done

 

结果:

gec@ubuntu:/mnt/hgfs/GZ2057/11 shell编程/02/code$ ./for.sh

hello

world

apple

tree

 

例题4:将所有传递进来的命令行参数都打印出来。

 

C语言:

#include <stdio.h>

 

int main(int argc,char *argv[]) // ./xxx aaa

{

int i;

for(i=0;i<argc;i++)

{

printf(“argv[%d]:%s\n”,i,argv[i]);

}

return 0;

}

 

shell:

#!/bin/bash

 

for s in $*

do

echo $s

done

 

七、shell函数。

1、在shell中,函数与C语言非常相似,都是用于封装内容,但是使用方式要比C语言简单。

例子:

int fun(char *p1,char *p2)  -> 形参

{

printf(“p1 = %s\n”,p1);  -> 调用形式参数

printf(“p2 = %s\n”,p2);  -> 调用形式参数

return 10;

}

 

int main(int argc,char *argv[])

{

int ret;

ret = fun(“hello”,”world”);  -> 实参

printf(“ret = %d\n”,ret);

return 0;

}

 

2、shell函数形式参数如何写?如何调用形式参数?以及返回值?

 

fun()   -> 形式参数如何写?-> 不用写,括号里面不需要填任何的东西

{

//函数体:如何调用形式参数?

$1  -> 第一个形式参数

$2  -> 第二个形式参数

$*  -> 代表所有的形式参数

 

//如何返回返回值?-> 使用return

return x;  -> 默认都是整型数据,不需要在函数名字前面添加返回值类型。

}

 

3、如何调用函数?

C语言:

函数名(实参1,实参2,实参3,….);

 

shell:

函数名 实参1 实参2 实参3

 

4、如何查看函数的返回值?

echo $?

 

5、shell程序。

fun()

{

$1  -> 代表fun函数的第一个形式参数

$2  -> 代表fun函数的第二个形式参数

$*  -> 代表fun函数的全部参数

}

 

$1  -> 命令行的第一个额外的参数

$2  -> 命令行的第二个额外的参数

$*  -> 代表命令行的全部参数

 

 

例题5:写一个函数,该函数的功能是将所有传递给函数的参数都打印出来。

 

#!/bin/bash

 

myfun()  //myfun函数的实现过程,记住()里面不需要写任何的东西

{

for s in $*    //$*就是代表函数的所有的形式参数

do

echo $s

done

 

return 10   //函数执行完,就返回一个10。

}

 

 

myfun hello world apple   //调用myfun这个函数,并传递了三个参数(hello,world,apple)过去。

echo $?  //查看刚刚的myfun函数执行完的返回值。

 

八、trap命令  -> man 1 trap

功能:trap — trap signals  -> 捕捉信号。

 

signal(SIGUSR1,fun);

trap fun SIGUSR1

 

例题6:  假设某一个正在运行的脚本收到了SIGINT信号,就执行某一个函数。

 

 

#!/bin/bash

 

fun()

{

echo “helloworld”

return 0

}

 

trap fun SIGINT

 

declare -i n=1

while [ $n -eq 1 ]

do

n=1

done

 

 

等价于

C语言:

void fun(int sig)

{

printf(“helloworld!\n”);

}

signal(SIGINT,fun);

while(1);

转载请注明:XAMPP中文组官网 » 嵌入式linux系统-02-shell编程

您必须 登录 才能发表评论!