Shell编程
本来打算寒假回家好好学习Linux的,为以后学习嵌入式打好基础的!回家之后的学习效率非常低,之前为了搭建Linux环境,折腾了很长时间,学到现在也就勉强才把Shell编程学完了!今天就把自己学习的相关知识点总结整理一下!
个人感觉shell程序跟windows下的批处理文件有点像,就是将一些系统命令写进一个可执行文件中,然后执行。shell程序的语法跟C语言也很相似,所以有了C语言的基础,对shell程序的理解上有很大的帮助!
一.shell基础
1.shell是一个作为用户与linux系统之间接口的程序;
2.重定向输出
ls –l > lsoutput.txt 将ls -l输出的内容写到lsoutput.txt文件中。
ps >>lsoutput.txt 将输出的内容追加到lsoutput.txt文件的末尾
3.重定向输入
more <killout.txt 将killout.txt中的内容作为more命令的参数
4.管道:在linux下通过管道连接的进程可以同时进行,并且随着数据流在他们之间传递可以自动的协调。
ps | sort | > jingcheng.txt
5.运行shell程序有两种方式:
调用shell,将脚本文件名作为shell的参数; /bin/sh first.sh
将脚本文件设置为可执行; chmod +x first.sh first.sh
二.shell语法
1.变量
所有变量都是看做字符串并以字符串来存储,shell和一些工具程序会在需要的时候将字符串转化成相应的数值。Linux是一个区分大小写的系统。如果字符串里包含空格,就应该将其用引号括起来。*是字符串匹配字符,?是单个字符匹配字符。
echo $var hello
var=”hello world”
echo $var hello world
echo “$var” hello world
echo ‘$var’ var
2.环境变量
当一个shell程序开始执行时,一些变量会根据环境变量中的设置的值来进行初始化。主要的环境变量有
$PATH 以冒号隔开用来搜索命令的目录列表
$0 shell脚本的名字
$# 传递脚本参数个数
$$ shell 脚本的进程号,通常用他来生成临时文件 /tmp/tmpfile_$$
3.参数变量
如果脚本程序带有参数,一些额外的变量就回创建。即是没有传递任何参数,环境变量$#也依然存在,只不过值是0
$* 打印所有参数,并按照环境变量IFS第一个字符来分隔参数
$@ 将所有参数打印出来,并且不会挤在一起
$1,$2…分别代表第一个,第二个参数
echo “$@” foo bar foo
echo “$1” foo
echo “$2” bar
4.条件
then …
.. fi
fi
文件条件测试:
-f 文件是普通文件即为真
-d 文件是目录即为真
5.控制结构,这部分很好理解,类似与C语言中的语法
if语句
then
statement
else
statement
fi
elif语句相当于嵌套if语句,等价于else if
注意
if [$var =”yes”]; then 这里判断等于用=,不是C语言中的==,注意!!
…
$var”比$var更安全,因为万一$var 的值为空的话,在判断$var=”yes”是就会出现错误,加上引号就不会出现这种问题了。
for循环
do
…
done
do
echo $var
done
while循环
statements
done
until 语句
do
statements
done
case语句
y) echo ”yes”;;
yes) echo “yes”;;
n) echo “no”;;
no) echo “no”;;
*) echo ”please input again”
esac
yes | y) echo ”yes”;;
no | n) echo “no”;;
*) echo ”please input again”;;
esac
有时候还会采取这样的 [Yy][Ee][Ss] 这样的形式来匹配6种可能的输入形式,保证输入任何形式都有相应的处理。
命令列表,有时候可能需要将几条命令连接成一个序列。
and列表 条件1&&条件2&&条件3…
or列表 条件1 || 条件2 || 条件3…
6.函数
函数定义和C语言的形式类似
函数调用直接用函数名,后面跟上参数,不需要用括号。
当一个函数被调用时,脚本程序的位置参数($*,$@,$#,$1,$2..)会被替换成函数的参数,当函数执行完之后就回还原原来的值。
{
echo “you your name is $*” 这里就表明这个函数需要参数了
echo “your first name is $1”
echo “your last name is $2”
}
echo “please input your name”
read name
name “$name”
exit 0
三.命令
命令分为两种,一种是在命令提示符下执行的普通命令,成为外部命令;另一种是内部命令,在shell内部实现的,不能作为外部程序被调用。内部命令执行效率更高。
1.break命令,和C语言中一样,只跳出一层循环,这里不多讲了。
2.:命令,相当与一个空命令,可以看作是true,但是执行比true快。
3.continue命令,跳到下一次循环继续执行,也和C语言中一样。
4.echo命令,可以使用echo –n 来清除最后的换行符。
5.eval命令
x=foo
y=’$’$x
echo $y
这里输出的是 $foo,如果将 y=‘$’$x 换成 eval y=’$’$x,输出的是10,eval的命令就相当于额外的一个$,他给出一个变量值的值。
6.exit n 使脚本程序以退出码n退出程序,0表示成功退出,1~125表示错误退出,其他退出码有特殊含义。
7.export命令 export命令将自己的参数创建为一个环境变量,而这个环境变量可以被当前程序调用的其他脚本和程序看见。
export PATH =/bin:$PATH
8.expr命令将他的参数当作一个表达式来求值
x=`expr $x+1`这里的反引号 ` ` 使x的取值等于expr $x+1,也可以用$()来表示。
9.printf等同于C语言中的用法,格式化输出
10.return命令,可以作为函数的返回值
11.set命令,是为shell设置参数变量
echo the month is $2
exit 0
12.trap命令
trap 操作命令 信号
当接收到某个信号时,执行指定的操作命令
trap ‘rm –f /tmp/my_tmp_file$$’ INT INT为中断信号
两个重要的命令
find命令
find [路径][选项][测试][行为]
路径就是查找的路径
测试(常用的两种)
-name pattern 文件名按照pattern 匹配
-newer fileneme 文件比fileneme 要新
-type c 文件的类型是c,d(目录文件),f(普通文件)
有时候还会使用组合测试 !/not 测试取反 ; –a/-and 两个测试相与; -o/-or 两个测试相或
eg:\( –name “_*” –or –newer file2 \) 注意这里的\是转义字符。
动作
-exec 命令 执行一个命令,这个动作使用\;字符结束
-print 打印文件名
-ls 对当前文件使用命令ls
grep命令
grep [选项] pattern [files]
grep -c in file1.txt file2.txt
-c表示输出匹配行的数目
-v表示反匹配
正则表达式
grep e$ word2.txt 找出结尾是e的行
$表示一行的结尾
^表示一行的开头
[ ] 表示包含的字符范围
. 表示任意单个字符
grep a[[:blank:]] 匹配方式:a加上空格制表符
[:blank:]空格和制表符
[:ascii:] ASCII码字符
grep –E [a-z] \{10\} word2.txt
如果指定了用于扩展匹配的-E选项,对于grep命令还需要在这些字符之前加上\字符。
{n} 必须匹配n次
{n,}必须匹配n次及以上
{n,m}必须匹配n次到m次之间
+ 必须匹配1次或多次
* 必须匹配0次或多次
?最多匹配一次
以上就是shell编程的大部分知识,知识点很多很碎,通过这部分可以帮助我们熟悉一下Linux的命令。