Shell脚本学习

                                                                                                                             shell脚本学习

 

shell就是命令解析器,将用户输入的指令转换为相应的机器能够运行的程序。

Shell是一个作为用户与linux系统间接口的程序,它允许用户向操作系统输入需要执行的命令,在linux中可有多种shell。

一:Shell的种类:

ash:是贝尔实验室开发的shell,bsh是对ash的符号链接。

bash:是GNU的Bourne Again shell,是GNU操作系统上默认的shell。sh以及bash2都是对它的符号链接。

tcsh:是Berkeley UNIX C shell。csh是对它的符号链接 

二:shell命令

shell命令的基本格式是:

命令名  [选项]   <参数1> <参数2> ……

shell提示符 :# $

GNU工具中的bash,作为/bin/sh被默认安装

大多数linux发行版中,shell程序/bin/sh实际上是对程序/bin/bash的一个链接

命令/bin/sh -version可用于查看bash的版本。

三:shell脚本

Shell脚本是一个包含一系列命令序列的文本文件。当运行这个脚本文件时,文件中包含的命令序列将得到执行。

Shell脚本的第一行必须是如下格式:

#!/bin/sh

符号#!用来指定该脚本文件的解析程序。在上面 例子中使用/bin/sh来解析该脚本。当编辑好脚本后,如果要执行该脚本,还必须使其具有可执行属性:chmod +x filename。

在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。如果使用了注释,即使相当长的时间内没有使用该脚本,也能在很短的时间内明白该脚本的作用及工作原理。

Shell脚本的执行:sh hello.sh(假设有一个hello.sh的脚本)。

 

 

变量:在shell编程中,所有的变量都由字符串组成,并且不需要预先对变量进行声明,

#!/bin/sh

#set variable a

a=8

#print a

echo "a is:"

echo $a

注意思考:

例子1:

A=8

echo $ABC 输出啥?为什么?

A=8

echo ${A}BC 输出啥?为什么?

例子2:

A=8

echo “$A” 输出啥?为什么?

A=8

echo $A 输出啥?为什么?

$A会被解析为变量,输出8,‘$A’输出$A;

 

默认变量:

$# :传入脚本的命令行参数个数

$* :所有命令行参数值,在各个参数值之间留有空格

$0 :命令本身(shell文件名)

$1 :第一个命令行参数

$2 :第二个命令行参数

 

局部变量:

在变量首次被赋值时加上 local 关键字

1.变量赋值时,“=”左右两边都不能有空格

2.BASH 中的语句结尾不需要分号

 

IF语句

if [expression ]

then

#code block

fi

 

 

if [expression ]

then

#code block

else

 

#code block 
fi

 

if [ expression ]

then

#code block

elif [ expression ]

then

#code block

else

#code block

fi

 

 

if [ expression ]; then

#code block

elif [ expression]; then

#code block

else

#code block

fi

 

比较:

比较操作整数操作 字符串操作

相同-eq

不同-ne != 

大于-gt

小于-lt

大于或等于 -ge 

小于或等于 -le

为空-z

不为空-n

比较整数a和b是否相等:if [ $a = $b ] (也可用eq)

判断整数a是否大于整数b:if [ $a -gt $b ] 

比较字符串a和b是否相等:if [ $a = $b ] 

判断字符串a是否为空: if [ -z $a ] 

判断整数变量a是否大于b:if [ $a -gt $b ]

1. 在“[”和“]”符号的左右都留有空格

2. “=”左右都有空格

 

 

 

 

-e文件已经存在

-f文件是普通文件

-s文件大小不为零

-d文件是一个目录

-r文件对当前用户可以读取

-w文件对当前用户可以写入

-x文件对当前用户可以执行

例S5:

#!/bin/sh

folder=/home

[ -r "$folder" ] && echo “can read $folder"

[ -f "$folder" ] || echo "this is not file"

 

FOR循环

for 循环结构与 C 语言中有所不同,在 BASH 中for循环的基本结构是:

for var in [list]

do

#code block

done

其 中 $var 是循环控制变量,[list] 是 var 需要遍历的一 个集合,do/done 对包含了循环体,相当于C语言中的一对大括号。另外如果do 和 for 被写在同一行,必须在 do 前面加上 “;”。如: 

for $var in [list]; do...done

 

#!/bin/bash

for day in Sun Mon Tue Wed Thu Fri Sat

do

echo $day

done

如果列表被包含在一对双引号中,则被认为是一个元素,如:

#!/bin/bash

for day in "Sun Mon Tue Wed Thu Fri Sat "

do echo $day done

上面的例子中,在 for所在那行,变量 day 是没有加 "$"符号的,而在循环体内,echo 所在行变量$day是必须加上"$"符号的。

 

WHILE循环

while 循环的基本结构是:

while [ condition ]

do

#code block

Done

 

 

UNTILL循环

until 循环的基本结构是:

until [ condition ]

do

#code block

done

while 和 until的区别在于while是为真时执行,until是为假时执行

 

CASE语句

 

BASH 中的 case 结构与 C 语言中的 switch 语句的功能比较类似,可以用于进行多项分支控制。

case "$var" in

condition1 )

;;

condition2 )

;;

* )

default statments;;

esac

例子:

#!/bin/bash

echo "Hit a key, then hit return.“

read Keypress

case "$Keypress" in

[[:upper:]] )echo" Uppercase letter";;

[[:lower:]] )echo" Lowercase letter";;

[0-9] )echo"Digit";;

* ) echo "Punctuation, whitespace, or other";;

Esac

 

 Bash shell的功能

1.命令记忆能力

2.使用Tab键进行命令与文件的补全功能

3.设置命令的别名(eg:alias lm=ls -l

4.作业控制、前台、后台控制

5.程序脚本(shell script)

6.支持通配符

 

 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。