Shell编程

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是一个区分大小写的系统。如果字符串里包含空格,就应该将其用引号括起来。*是字符串匹配字符,?是单个字符匹配字符。

var=hello world
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…分别代表第一个,第二个参数

set foo bar foo
echo “$@” foo bar foo
echo “$1” foo
echo “$2” bar

4.条件

if test –f fred.c if [ –f fred.c ]; then
then …
.. fi
fi

文件条件测试:

-f     文件是普通文件即为真

-d     文件是目录即为真

5.控制结构,这部分很好理解,类似与C语言中的语法

if语句

if condition
then
  statement
else
  statement
fi

elif语句相当于嵌套if语句,等价于else if

注意

if [$var =”yes”]; then 这里判断等于用=,不是C语言中的==,注意!!

$var”比$var更安全,因为万一$var 的值为空的话,在判断$var=”yes”是就会出现错误,加上引号就不会出现这种问题了。

for循环

for var in values  
do                                                            

done
for var in bar fud 43
do 
  echo $var
done

while循环

while condition do
statements
done
until 语句
until conditions 条件为假时执行
do
statements
done

case语句

复制代码
case “$var” in 
 y) echo ”yes”;;
 yes) echo “yes”;;
 n) echo “no”;;
 no) echo “no”;; 
 *) echo ”please input again”
esac
复制代码
case “$var” in 
  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..)会被替换成函数的参数,当函数执行完之后就回还原原来的值。

复制代码
name()
{
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命令

foo =10
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设置参数变量

set $(date)
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的命令。

 
 
分类: Linux
原文地址:https://www.cnblogs.com/Leo_wl/p/2889492.html