1.变量赋值方式
a) var=value #这种赋值方式需要value没有空格符号
b) var=”value” #包含空格的变量可以这样赋值
2.变量应用:$变量名
3.环境变量
a) HOME
b) PWD
c) USER
d) UID
e) SHELL
4.字符串长度获取:length=${#var}
5.获取命令输出,将其存入变量中的语法
a) getstring=$(cmd | cmd) #称为subshell
echo $getstring
例如:
val=$(ls -la)
echo $val
b) getstring=`cmd` #反引用
echo $getstring
1、let: 可直接执行基本的算数操作
a) val=3 \ let val--
2、[ ]:
a) result=$[ $val + 19 ]
3、( ( ) ):
a) result=$( ($val + 19 ) )
4、精密数学运算bc
a) echo “2 * 0.2” | bc
1.for循环
格式1:
for var in list
do
command; #使用变量$var
done
格式2:
for((i=0;i<10;i++))
{
command; #使用变量$i
}
2.while循环
while condition
do
command;
done
用true能产生无限循环
3.until循环:一直循环直到给定条件为真
x=0;
until [ $x -eq 9 ];
do let x++;
done
4.比较与测试
a) if
if condition;
then
commands;
fi
if condition;
then
commands;
elif conditions;
then
commands
else
commands
fi
b) [ condition ] && action;#条件为真执行
c) [ condition ] || action; #条件假执行
d) 算数比较 [ $var -eq 0 ]
i. -gt :大于
ii. -lt:小于
iii. -ge:大于或等于
iv. -le:小于或等于
e) 文件测试
i. [ -f $file_val ]:如果给定的变量包含的文件可执行,则返回真
ii. [ -x $var ]:如果给定的变量包含的文件可执行,返回真
iii. -d:如果给定的变量包含的是目录,返回真
iv. -e:如果给定的变量包含的文件存在,返回真
v. -c:如果给定变量包含的是一个字符设备文件的路径,返回真
vi. -b:如果给定变量是一个块设备路径,返回真
vii. -w:可写为真
viii. -r:可读为真
ix. -L:给定变量包含的是一个符号链接,返回真
f) 字符串比较
i. [ [ $str1 = $str2 ] ]《=等价=》[ [ $str1 ==$str2 ] ]:
ii. [ [ $str1 != $str2 ] ]:不等为真
iii. [ [ $str1 > $str2 ] ]
iv. [ [ $str1 < $str2 ] ]
v. [ [ -z $str2 ] ]:如果str2包含的是空字符串,则返回真
vi. [ [ -n $str2 ] ]:如果str2包含的是非空字符串,则返回真
5.
1、定义
function fname()
{
statements;
}
2、调用:
a) fname; #执行函数
b) fname arg1 arg2 ; #传递参数
3、参数说明
function fname()
{
echo $1,$2; #用于访问参数1,2,既调用时传递进来的参数
echo “$@”; #以列表方式一次性打印所有参数
echo ”$*”; #将所有参数拼接成当个字符串
return 0; #返回
}
语法熟悉了,最近一直在重复着创建文档这种机械工作,想了一下,既然学了shell ,那就操起小刀动起来吧。
其中用到了shell的一些命令工具,到时有空再来整理整理....
#!/bin/sh
#作者:hntea
#时间:2016/3/14
###############################################################################
#脚本功能说明
#
# 1、查看当前是否存在驱动文件;否则调用make编译,是则将其复制到指定目录下
# 2、查看当前是否存在应用文件;否跳过,存在则编译并将生成的文件复制到指定目录
# 3、查看指定目录是否存在,否则以固定格式创建目录 lesson<X>-<drivername>
#
##############################################################################
_DEBUG=on
#定义调试函数,调用脚本定义_DEBUG=on 可以启动调试打印功能
#$@:用于告诉脚本执行后面的所有命令
#:用于告诉脚本不要进行任何操作
function DEBUG()
{
[ "$_DEBUG" == "on" ] && $@ || :
}
################################################
#变量说明
# ARCH_KO:存放驱动文件名
# ARCH_APP:存放应用文件名
# ARCH_DIR:文件去向路径
# dirlist:目标路径子目录列表【字符串】
################################################
ARCH_KO=$(ls $PWD | grep *.ko )
ARCH_APP=$(ls $PWD | grep *app.c)
ARCH_DIR=/hntea/lesson/kernel-and-driver/lesson3-make_filesystem/rootfs/lesson
#获取子目录列表
dirlist=`ls $ARCH_DIR| grep lesson`;
################################################
#函数名:get_koname OK
#函数功能:获取驱动文件名
#输出参数:
# 成功:驱动名
# 失败:空字符
################################################
function get_koname()
{
#判断是否存在APP文件,字符串不为空为真
if [[ -n $ARCH_KO ]];
#存在
then
#获取文件名法一:
name=${ARCH_KO%.ko}; #%操作符可以将 “名称.扩展名”格式的文件名提取出来,原理是从从又到左删除字符,直到遇到.
#获取文件名法二
#neme=$`echo $ARCH_APP | tr -d '.c'`;
else
#不存在
name= ; #空字符串
fi
echo "$name";
}
################################################
#函数名:get_dirnum OK
#函数功能:获取子目录最大编号
#输出参数:
# 成功:当前子目录最大编号
# 失败:0
################################################
function get_dirnum()
{
dirmaxnum=0;
#从目录列表中截取数字列表
numlist=$(echo "$dirlist" | tr -d -c '0-9 \n');
#查询列表最大值
for var in $numlist;
do
#写法一:
# if [ $var -gt $dirmaxnum ];
# then
# dirmaxnum=$var;
# fi
#写法二:
[[ $var -gt $dirmaxnum ]] && dirmaxnum=$var;
done
#输出最大值
echo $dirmaxnum;
}
################################################
#函数名:get_appname
#函数功能:获取APP文件前缀
#输出参数:
# 成功:APP名
# 失败:空字符
################################################
function get_appname()
{
#判断是否存在APP文件,字符串不为空为真
if [[ -n $ARCH_APP ]];
#存在
then
#获取文件名法一:
name=${ARCH_APP%.c}; #%操作符可以将 “名称.扩展名”格式的文件名提取出来
#获取文件名法二
#neme=$`echo $ARCH_APP | tr -d '.c'`;
else
#不存在
name= ; #空字符串
fi
echo "$name";
}
################################################
#函数名:subdir_build OK
#函数功能:在指定目录下ARCH_DIR下创建子目录
#输出参数:
# 该函数没问题
################################################
function GO_build()
{
#获取目录下子目录的最大值
max=`get_dirnum`
koname=`get_koname`
appname=`get_appname`
if [[ -z $koname ]];
then
echo "驱动文件不存在,请编译好驱动再执行该脚本! 脚本终止";
exit 0;
fi
#匹配存在最大值子目录名
echo "该课时主要完成 $koname 驱动..........."
#遍历子目录列表
for var in $dirlist
do
#匹配存在最大值子目录名
whichdir=`echo $var | tr -d -c '0-9 \n'` ;
if [ $whichdir -eq $max ];
then
whichdir=$var;
echo "最大子目录名字:$whichdir";
getdir=$var;
fi
done
#截取存在最大值子目录名的后半部
wdir_name=${getdir#*-};
echo "最大值的子目录的后半部:$wdir_name"
#判断是否与驱动名相等
if [[ $wdir_name != $koname ]]
then
let max++;
echo "接下来为第 $max 课时"
#目录合成
desname=`echo $ARCH_DIR/lesson$max-$koname`
echo "正在建立新课时 $desname..........."
mkdir $desname;
echo "在$ARCH_DIR/ 下建立 $desname 目录完毕...."
echo "干的漂亮!"
else
echo "第 $max 课时还在进行,加紧了亲!"
echo "子目录已经存在"
desname=`echo $ARCH_DIR/lesson$max-$koname`
fi
#文件复制
if [ -z $appname ];
then
echo "没有相应的上层应用程序...."
else
echo "应用软件名为:$ARCH_APP"
arm-linux-gcc -static $ARCH_APP -o $appname
echo "应用软件编译完成,正在复制带指定目录...$desname"
cp $PWD/$appname $desname/
echo "复制成功"
fi
echo "将驱动文件复制到$ARCH_DIR/$desname 目录下"
cp $ARCH_KO $desname/
echo "复制成功"
}
GO_build