<LINUX >bash shell 入门 --linux学习笔记
首先说下我个人对于shell的理解,我觉得shell是一种通过各种控制语句将linux命令进行集合实现批处理的一种脚本语言.
shell编程入门其实很简单,语法知识并不多,但是高级shell编程就很难,因为shell是用户和linux之间的桥梁,要编写高质量的shell脚本,就需要用户对linux有很全面的认识.
这里我们只分析shell脚本的语法知识,如想透彻的学习linux还需多努力.
shell结构
1.#!指定执行脚本的shell
2.#注释行
3.命令和控制结构
创建shell程序的步骤:
1.创建一个包含命令和控制结构的文件
2.修改这个文件的权限使它可以执行,使用chmod u+x
3.执行 ./example 或者sh exmaple
如下为一个简单的shell脚本,显示当前目录路径,和子文件
demo.sh
#!/bin/sh
#we use pwd to print the directory path
/bin/pwd
#we use ls to print the children directories
/bin/ls
变量
shell变量有两种
1.临时变量
只在当前文件中起作用。包括用户自定义变量和位置变量
2.永久变量
永久变量又叫环境变量,其值不随脚本的结束而消失
设置变量的时候直接使用变量名加赋值即可如date=`date`;而在使用该变量的时候加上$,如echo $date
/~example.sh
date=`date`
echo $date
输出:Tue May 20 07:48:45 EDT 2014
使用set命令可以列出所有的环境变量
#set | less
使用unset可以清除已经定义的变量
如:#unset date
位置变量
类似于c语言的agrc和argv
例如:
ls file1 file2 file3
$0 这个程序的文件名 ls
$n 这个程序的第n个参数 n >=1
特殊变量
$*这个程序所有的参数
$#这个程序的参数个数
$$这个程序的PID
$!执行上一个后台命令的PID
$?执行上一个命令的返回值
输入输出操作
read myname // 从键盘获取姓名
echo $myname //输出姓名
当然也可以一次读入多个数据,和输出多个数据
read p1 p2 p3
echo $p1 $2 $p3
运算操作
expr命令: 对整数型变量进行算术运算
例如:expr 3 + 5 //数字和运算符之间加上空格,不然会输出 3+5 而不是想要的8
expr 5 – 2
expr 5 \* 2 //需要对*进行转义
expr 5 / 2
在shell运算中没有小括号的定义,如果在多项式中想指定运算步骤应该用expr代替括号
如 expr `expr 5 – 2 ` \* 2 //其中`为键盘坐上角的符号不是单引号!!!!
变量测试语句
用于测试变量是否相等,是否为空,文件类型等
格式 :test 测试条件 //测试范围:整数,字符串,文件
字符串测试:
test str1=str2 //测试两字符串是否相等
test str1=str2
test str1 //测试字符串是否不为空
test –n str1 //同上
test –z str1 //测试字符串是否为空
整数测试:
test intl –eq int2 //测试相等
test int1 –ge int2 //测试int1是否大于等于
test int1 –gt int 2 //大于
test int1 –le int //小于等于
test int1 –lt int2 //小于
test int1 –ne int2 //测试是否不相等
文件测试:
test –d file //是否为目录
test –f file //是否为常规文件
test –x file //是否为可执行文件
test -r file //可读
test –w file //可写
test –a file //文件是否存在
test –s file //文件的大小是否为0
变量测试语句可以[]进行简化
test –d $1 等价于 [ –d $1 ] //之间有空格
条件控制语句
1.if
结构:
if test –d $1 then
//TODO
elif 条件2 then //else if
//TODO
fi
2.exit语句
退出程序执行,并返回一个返回码,返回码为0表示正常退出,非0表示非正常退出
3.多个条件的联合
-a : 逻辑与,仅当两个条件都成立时,结果为真
-o:逻辑或,两个条件只要有一个成立,结果为真
如 [ –w $file –a –r $file ] //判断文件是否可读可写
4.for …done 语句
for 变量 in 名字表 //名字表类似于数组,只是shell中没有数组,所以需要全部罗列 之间用空格隔开
do
命令列表
done
5.select
select 变量 in 关键字
do
命令列表
done
select 把关键字中的每一项做成类似表单,以交互的方式执行do和done之间的命令
6.case…esac语句
case 变量 in
字符串1) 命令列表1 ;;
字符串2) 命令列表2 ;;
esac
7.while
while 条件
do
命令
done
8.shift指令
每执行一次,参数序列顺序左移一个位置,$#的值减1
用于分别处理每个参数,移出去的参数不在可用
函数的应用
函数的定义
函数名()
{
命令序列
}
函数的调用:
函数名 参数1 参数2 。。。
脚本的调试
sh –x script
执行脚本并显示所有变量的值
sh –n script
执行脚本只检查语法错误,将返回所有的语法错误