您的位置:首页 > 运维架构 > Shell

Linux Shell 编程语法

2016-03-18 22:28 471 查看

Shell 编程

变量

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: