linux学习---shell编程
一.Shell编程
首先声明下,我是一个shell菜鸟,甚至连菜鸟都称不上,刚学了2天shell,把学习的整理下,如果发现有什么错误,请指正,另外,如果想要了解详细的shell编程,请借助linux 那个”男人”,我发现man bash东西好多····
简单来说Shell是一个负责把用户的语法的语言解释成系统与内核调用的解释程序
最早的shell采用的语言是algol语言,后采用C语言
所以shell可以根据语言分类
Algol:sh,ksh,bash
C:csh,tcsh
目前我机器是安装的是ubuntu 16 04,默认是bash,所以后续后半部分采用bash去说明下shell的使用
可以使用 echo $SHELL来看下你默认的linux or unix版本的shell,执行如下,我们可以看到是默认执行/bin下的bash程序
二.编写第一个shell脚本
Shell脚本默认扩展名没有做强制要求,但是强烈推荐为*.sh
Shell编程用;或者 newline分隔命令
并且shell第一行必须用#!/bin/bash来指定shell解释程序
#!/bin/bash
date
ls
date;ls
执行结果如下,需要注意的是在执行前必须通过chmod来增加执行权限
三.普通变量使用示例
因为shell是弱语言类型,所以无需声明类型
用如下形式定义
变量的引用
$变量名
程序源码
#!/bin/bash
a=20
b=hello
c=
echo${a}${b}${c}
echo $a
d=20+30
echo $d
执行结果
大家有没有看到一个奇怪的地方就是打印d的时候,居然打印出胡20+30,因为shell把他认为是字符串打印出来,解决这个有两种方法
1. declare –i 变量
2. typeset –i 变量
四.命令行变量
命令行参数一共有几个以下特殊的定义
$# ----à命令行参数个数
$*-----à所有命令行参数
$0-----à命令本身
$1~$9-----à第一个到第九个参数,注意,参数超过10个,需要自己解析
程序以及运行结果为
五.数组的操作
1. 数组定义
三种方式
1) a[1]=10;a[4]=40
注意:shell数组并不要求下标是连续的
2)declare -a b=(1 2 3 4)
3)c=(hello world)
2. 数组的操作
1) 获取数组长度
declare -a b=(1 2 3 4)
echo 'b len'${#b[*]}
echo 'b len'${#b[@]}
执行结果
2) 读取某个下标值
c=(hello world)
echo ${c[1]}
执行结果
3) 打印整个数组下标
c=(hello world)
echo ${c[*]}
echo ${c[@]}
执行结果
4) 打印整个数组
a[1]=20;a[3]=30
declare -a b=(1 2 3 4)
c=(hello world)
echo ${!a[*]}
echo ${!b[*]}
echo ${!c[@]}
执行结果
六.流程控制
条件语句
1. if语句
语法:
if 条件测试语句
then
语句
[elif 条件
then
语句
else
语句
]
fi
条件不清楚请参考:http://blog.csdn.net/xiaoxiaopengbo/article/details/78143393
来个实例体会下if语句
实例代码和运行图
循环语句
2. for循环
语法:
for((表达式; 表达式; 表达式))
do
语句
done
实例代码和运行图
3. While语句
语法:
while 条件测试
do
语句
done
实例代码和运行图
4. Until语句
语法:
until 条件测试
do
语句
done
和while的区别是while满足条件测试执行,而until是满足条件退出
实例代码和运行图
5. For in语句
语法:
for 变量 in 字符串列表
do
语句
done
实例以及运行图
此处需要注意的点是:如果字符串被“”放进去,只会循环一次
选择语句
6. Select语句
语法:
select 变量 in 列表
do
语句
done
此语句相当于在列表中选择,实例以及运行效果
注意$REPLY 会捕获你的输入,村早REPLY里面,这个会用到case中
7. Case语句
case 值 in
值1)
语句
;;
值2)
语句
;;
*)
语句
;;
esac
实例和测试结果
七.综合案例
找到一个目录中的最新文件
#!/bin/bash
if [[ -z$1 ]]
then
workdir=.
else
workdir=$1
fi
newfile=
allfiles=`ls${workdir}`
echo$allfiles
for filein $allfiles
do
newfile=$file
break
done
for filein $allfiles
do
if [[ $newfile -ot $file ]]
then
newfile=$file
fi
done
if [[ -z$newfile ]]
then
echo "dir is empty"
else
echo newfile:$newfile
fi
上一篇: 初学卡尔曼滤波
下一篇: Linux -Shell 编程学习(一)