15.华清嵌入式--shell脚本
一.shell脚本基础知识
shell脚本(shell命令的有序集合)
编译型语言(c语言,需要编译成可执行文件,但是执行效率高)
解释型语言(shell语言,不需要编译,使用灵活)
shell编程基本步骤
- 建立shell文件(.sh结尾 cat progl.sh)
- 赋予shell文件执行权限(chmod 740(777) 文件名)
- 执行shell文件(./pro.sh 或者改下环境变量)
二.shell变量
1.任何赋值都解释为 一串字符。
例:
count=1 //注:变量没有类型,等号不能有空格
echo $count
DATE =`data` //data为一个命令,用命令置换符
echo $DATE
unset DATE //unset命令删除变量赋值
2.Bourne shell 的四种变量
用户自定义变量(通常变量用全大写(COUNT=1))
位置变量(命令行参数)
预定义变量
环境变量
(1)用户变量注意事项:变量全大写,变量前加$,
(2)位置变量
$1 --$9 包含第一到第九个命令行参数(命令行赋值)
${10} //9以上用括号括起来
$# 命令行参数的个数
[email protected]($*)显示所有命令行参数
$? 前一个命令的退出状态(输出结果)
$$ 包含正在执行进程的ID号
(3)环境变量
export (env)//查看常见的环境变量
常用环境变量
HOME:$HOME etc/passwd文件中列出的用户主目录
IFS: Internal Field Separator, 默认为空格,tab及换行符
PATH:搜索路径
PS1,PS2; 默认提示符($)及换行提示符(>)
TERM: 终端类型,常用的有vt100,ansi,vt200,xterm等
三.shell功能语句
1.shell语句包括三类
说明性语句:(#开始,就是注释),
功能性语句:(shell命令,用户程序或者其他shell程序),
结构性语句:(条件测试语句,多路分支语句,循环语句,循环控制语句)
2.
read 从标准输入读入一行,并赋值给后面的变量
read var1 var2 var3
例:
#!/bin/bash
echo “input anumber”
read NUM
echo $NUM
echo -n “input a number” //-n命令行输出参数不换行
3.expr 算数运算命令
主要用于简单整数运算(+ - \* / %)//乘法特殊要加转义符
A=`expr 12 + 5 \* 3`
echo $A
4.test 测试语句
可测试三种类型对象(字符串 整数 文件属性)
test “$answer” = “yes” //变量answer的值是否为字符串yes
test $num -eq 18 //num是否为18
test -d tmp //tmp是否为一个目录名
(1)文件测试
(-f 是否为普通文件 -L是否为链接文件)
f1 -nt f2 文件f1是否比文件f2更新
发 -ot f2 f1比f2是否更旧
(2)字符串测试
test $s1 = $s2 测试字符串内容是否一样
s1 != s2 测试字符串内容是否有差异
-z s1 字符串长度是否为0
-n s1 字符串长度是否不为0
(3)整数测试
a -eq b //是否相等
a -ne b // 是否不等
a -gt b //a是否大于b
a -ge b //a是否大于等于b
a -lt b //a是否小于b
a -le b// a是否小于等于b
pwd
echo $? //上一条指令是否成功,输出0代表成功
四.shell分支语句
条件测试语句
多路分支语句
循环语句
循环控制语句
后台执行语句
1.
if 表达式
then
命令表
fi
//then fi成对出现类似于c语言中的括号,每个if后面都要跟一个then
if test -f $1
then
echo “$1 is a file”
fi
2.
如果想加else呢?/
if test -f $1
then
echo “$1 is a file”
else
echo “$1 is not a file”
fi
3.
//if else if else 怎么表示
if test $val -eq 0 //if [ $val -eq 0 ]
then
echo “val=0”
elif test $val -gt 0//elif [ $val -gt 0 ]
then
echo “val>0”
else
echo “val<0”
fi
注:括号两侧要加空格
if [ $val -lt 0 ] || [ $val -gt 100 ]
then
echo “input error”
exit 0 //退出
fi
2.
c语言中的switch case语句,在脚本中类似的语句
多路分支语句case
只能检测字符串变量
右括号结束
一次可以匹配多个模式 | 分开
命令表以单独的双分号行结束,退出case 语句(类似于break)
模式n常写为字符*,表示所有其他模式 (类似于default)
例:
read val
val =`expr $val / 10`
case $val in
8|9|10)
echo “A”
;;
6|7)
echo “B”
;;
*)
echo “C”
;;
esac
五.shell循环语句
for 的用法
for ((val=1; val <= 5; val=$val + 1))//for val in 1 2 3 4 5
do
echo “val = $val”
done
//do 和done配合用类似于花括号
还可以取文件
for file in `ls`
do
echo “$file”
done
while 的用法
NUM=1
while (($NUM <10)) //while [ $NUM -lt 10 ]
do
echo”*********”
NUM=’expr $NUM + 1’
done
循环控制语句
break 之后都不执行
continue //本次不执行
六.函数
fun()
{
A=$1
B=$2
C=$3
NUM=`expr $A + $B + $C`
echo “hello world”
return $NUM //返回的也是字符
}
fun 3 4 5 //函数调用及传参
//A B C等函数变量作用域是整个文件,如果想将A改为局部变量
local A=$1 //local