Shell 编程入门

来源:互联网 发布:仙侠道是哪个网络 编辑:程序博客网 时间:2024/05/21 01:47

shell简介

 

shell处于kernel的外层,用来负责接收使用者输入的命令,然后将命令解释成kernel能了解的方式,然后由kernel去执行,再将结果传回默认的输出周边。shell是一种命令解释器,同时也是一个程序语言。shell有很多种,在众多的Linux发行版中,标准的shell是bash,也是我们学习的主要对象。

 

第一个程序

范例:hello.sh

1. #!/bin/bash

2. echo 'Hello World'

 

执行之前,给予执行权限:

chmod +x hello.sh

 

执行:

./hello.sh

 

输出:

Hello World

 

这样第一个shell脚本就成功的运行了。

 




基础概念部分

 

登陆主机

登陆主机分为本地登陆和远程登陆。

本地登陆:就是直接面对主机,由键盘输入用户密码登陆,使用tty1-tty6,或者图形界面tty7

远程登陆:通过网络连接主机,以虚拟终端的方式登陆,使用ssh

 

退出登陆

1.使用命令exit

2.使用【Crtl+D】退出

 

文件

在Linux中,任何东西包括硬件都视为文件。文件可以分为几种:

一般文件:纯文本文件,二进制文件。如果文件具有执行权限,称为执行文件。

目录:包含文件。

设备文件:字符文件,磁盘文件。

内部进程通信文件:socket文件,连接文件(pipe、fifo)两种。

特殊文件:符号链接文件,soft link或者symbolic link

隐藏文件:文件名的第一个字符是一个点(.)

常见文件代码:

-   一般文件

d   目录

l   符号链接文件

b   块文件

c   字符文件

s   socket文件

p  管道文件

 

目录

目录也是文件的一种,目录中可以包含子目录和文件。

 

通配符

通配符是指一种文件名的样式,可用来对比文件名,以找到相符的文件。

* 代表任意的字符串,可以是空字符串

? 代表一个字符,但不可以为空

 

转义符

反斜线 \ 是转义字符,也叫做“逃逸字符”,目的在于使后接的字符回复原来作为单纯字符的用途。

 

字符集合

[abc] 代表a,b,c中任意的一个字符

[a-z] 代表a到z中的任意一个字符,小写英文字母

[A-Z] 代表大写英文字母

[A-Za-z] 代表字母

[0-9] 代表数字

[a-z_-] 代表任意一个小写英文字母,_ 或者 -

[!0-9] 代表非数字

[0-9!] 代表数字或感叹号

[\!0-9] 代表数字或感叹号

 

括号扩展

{g,nc,s}ftp 代表gftp ncftp sftp

 


shell程序的基本组成结构

 

shell结构大体是由设定变量、内置命令、shell的语法结构、函数组成。

使用实例说明:test.sh

1. #!/bin/bash

2. #说明使用/bin/bash作为这个脚本的解释器

3. 

4. #定义一个函数

5. function my_fun () {

6. echo "Hello, $1,today is $2"

7. }

8. 

9. #定义个变量

10. name=$1

11. today=`date`

12. 

13. #函数调用

14. my_fun "$name" "$today"

 

上面的这个脚本要想运行还需要做一些操作,首先给予执行权限

chmod +x test.sh

然后执行

./test.sh john

输出

Hello, john,today is Tue Jun  1 14:51:46 CST 2010

 

父shell和子shell

在执行script之前,身处的环境就是父shell。执行script之时,父shell根据#!/bin/bash,fork出来一个新的shell环境,然后在子shell中执行,执行完毕后子shell结束,任然回到父shell中,这样不会影响到父shell的环境。

 

login shell 和non-login shell

Shell 编程入门 - 南山南 - 一把来自北方的的吉他的博客

  

这张图片是login shell的流程,当是non-login shell时,只执行方框中的标注的部分。由这张图我们可以知道,在如下几种情况下,执行的流程。

登陆(login)/etc/profile

~/.bash_profile

 

注销(logout)

~/.bash_logout

 

执行新shell,分成两种情况

1.执行交互式的shell

~/.bashrc

/etc/bashrc

 

2.执行非交互式的shell,比如执行script

会检查 BASH_ENV 变量的内容,如果有定义,则执行

 


变量

 

变量是暂时用来存储数据的地方,是一个内存空间。bash shell和其他的编程语言,没有“数据形态”,也就是说默认情况下不区分一个变量是整型还是浮点型等,除非你使用declare语句申明变量类型。在bash shell中,默认只有一种数据型,就是由字符组成的字符串。同时,设定的变量只在当前的shell中存在,也就是,每一个shell都会维护一份他们自己的变量,彼此不会有影响。可以把变量导出成环境变量,这样其他的shell就可以被子shell引用。

 

变量的命名规则:

1.可以使用英文字母、数字和下划线组成

2.第一个字符不能是数字

3.区分大小写

 

变量设定:

变量名=值

例如:name=john

建议这样设定变量:name="john" 或者name='john'

在引用变量的时候使用双引号和单引号是有区别的,单引号不会进行变量替换。而在双引号中,如果也想抑制变量替换,则需要使用转义符反斜线 \

 

引用变量:

$变量名

建议这样引用变量:${变量名}

 

环境变量:

使用下面的任意一个方法可以使name变为环境变量

1.name="john"

   export name

2.export name="john"

3.declare -x name="john"

 

bash的一些重要的内置变量:

$1 ~ $n  参数位置。当n超过9后,使用${n},例如${10}

$* 代表所有的参数位置,而且视为一个字符串

$@ 代表所有的参数位置,但是代表各位置参数组成的串行

$# 参数的个数

$? 上一个命令的返回值

$! 上一个后台进程的编号

$$ 目前shell的进程编号

 



高级变量

 

高级变量中的3个主题:

变量扩展:${变量名}

命令替换:$(命令)

算术扩展:$((算术式))

 

测试变量存在与否R=${name-'john'},如果name不存在,则“传回”默认值。

测试变量不存在或者为空置R=${name:-'john'} ,如果name不存在或者存在但为空,则“传回”默认值。

测试变量不存在或值为空,则给变量一个默认值R=${count:=100}

测试变量不存在或值为空,则提示出错消息${变量名:?提示消息}

 


算术运算

 

归纳为5种方法

1.算术扩展,例如R=$((1+1))

2.使用外部程序expr,例如R=`expr 1+1`

3.使用$[],例如R=[1+1]

4.使用命令declare,例如declare -i R=1+1

5.使用命令let,例如let R=1+1

 


流程控制

 

if-then

if 条件; then

   动作

fi

 

if-then-else

if 条件; then

   动作1

else

   动作2

fi

 

if 条件1; then

   动作1

elif 条件2; then

   动作2

else

   动作3

fi

 

for

for 变量 in 列举

do

    命令

done

 

while

while 条件

do

    命令

done

 

until

until 条件

do

    命令

done

 

break continue

break跳出当前循环,continue提前进入下一次循环

 


函数

 

函数是一些命令的集合,作用是让程序模块化。

 

语法:
fuction 函数名()

{

   命令

}

 

或者

函数名()

{

   命令

}

 

或者

fuction 函数名

{

   命令

}

 



正则表达式

 

一个点(.)代表一个字符。

比如:.a. 代表3个字符,中间一个字符是a,两边各一个任意字符。

比如:... 代表3个任意字符。

若要匹配点(.)本身,则使用转义字符。

比如:my\... 代表my.后接两个字符。

 

行首匹配^

行尾匹配$

 

[...] 代表字符串中的一个字符。

比如:[abc] 代表a或b或c中的任意一个字符。

比如:[Mm]y 代表My或者my。

 

^出现在[]里,代表“非”

比如:[^a]代表不是a

 

*代表前面的字符有0个或者0个以上

比如:a*b代表ab或aab或aaab等。

 

\{...\}代表制定符合的个数。

比如:\{1,5\}代表前面的字符有1-5个。

 

Sed

sed基本语法:sed '样式' 文件

样式中,使用// 代表寻找,比如1,5代表第一到第五行,/aaa/,/bbb/ 表示作用范围从aaa的行到bbb的行。

例子:

sed '1,4d' file 指的是把第一到第四行删除。

sed '/aaa/d' file 指的是把还有aaa的那行删除。

sed '/[0-9]\{3\}/d' file 指的是把还有3个数字的行删除。

sed '/^$/d' file 指的是把空白行删除。

sed '/aaa/!d' file 指的是把不含有aaa行的删除。

sed '/aaa/p' file 指的是把含有aaa的行显示出来。

sed -n '/aaa/p' file 指的是把含有aaa的行显示出来,同时显示行号。

 

使用sed取代字符

例子:

sed 's/aaa/bbb/p' file 将bbb取代aaa,只取代一次。

sed 's/aaa/bbb/pg' file 将bbb取代aaa,全部取代。

sed 's/aaa//p' file 将aaa删除,只删除一次。

sed 's/^...//' file 将每行的前3个字符删除。

sed 's/...$//' file 将每行的后3个字符删除。

 

sed -n 's/\(a\)/\1b/p' file 找到第一个a然后替换成ab。

 

awk

awk '/aa/' file 显示含有aa的行。

awk '{print $1, $2}' file 显示第一第二字段。

awk '/aa/{print $1, $2}' file 将含有aa的行的第一和第二个字段显示出来。

awk -F: '/^root/{print $1, $2}' /etc/passwd 指定:为分隔符,打印第一和第二字段。

awk -F: 'BEGIN{OFS="+++"}'/^root/{print $1, $2} /etc/passwd 以:为分隔符,打印第一和第二段,而且彼此用+++分开。

 

0 0
原创粉丝点击