每日心灵鸡汤:
将军百战死,壮士十年归,用我有限的生命去创造无限的价值。生命的永恒就是为了热爱的事业付出终生的努力,我终将成为我信仰的人。-fq
一、测试语句。
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编程