Shell脚本

Shell脚本

概述
Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
Shell还是一个功能相当强大的编程语言,易编写、易调试、灵活性强。Shell是解释执行的脚本语言,在Shell中可以调用Linux系统命令。
同时它又是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
在排序算法中,Shell是希尔排序的名称。
基本上shell分两大类:
一:图形界面shell(Graphical User Interface shell 即 GUI shell)
例如:应用最为广泛的 Windows Explorer (微软的windows系列操作系统),还有也包括广为人知的 Linux shell,其中linux shell 包括 X window manager (BlackBox和FluxBox),以及功能更强大的CDE、GNOME、KDE、 XFCE。
二:命令行式shell(Command Line Interface shell ,即CLI shell)
例如:
bash / sh / ksh / csh / zsh(Unix/linux 系统)
(MS-DOS系统)
cmd.exe/ 命令提示字符(Windows NT 系统)
Windows PowerShell(支持 .NET Framework 技术的 Windows NT 系统)
传统意义上的shell指的是命令行式的shell,以后如果不特别注明,shell是指命令行式的shell。
文字操作系统与外部最主要的接口就叫做shell。shell是操作系统最外面的一层。shell管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果。
shell提供了你与操作系统之间通讯的方式。这种通讯可以以交互方式(从键盘输入,并且可以立即得到响应),或者以shell script(非交互)方式执行。shell script是放在文件中的一串shell和操作系统命令,它们可以被重复使用。本质上,shell script是命令行命令简单的组合到一个文件里面。
Shell基本上是一个命令解释器,类似于DOS下的command。它接收用户命令(如ls等),然后调用相应的应用程序。较为通用的shell有标准的Bourne shell (sh)和C shell (csh)。
交互式shell和非交互式shell
交互式模式就是shell等待你的输入,并且执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当你签退后,shell也终止了。
shell也可以运行在另外一种模式:非交互式模式。在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了。
shell的类型
在UNIX中主要有:
Bourne shell (包括 sh,ksh,and bash)
Bourne shell ( sh)
Korn shell ( ksh)
Bourne Again shell ( bash)
POSIX shell ( sh)
C shell (包括 csh and tcsh)
C shell ( csh)
TENEX/TOPS C shell ( tcsh)
Bourne Shell
首个重要的标准Unix Shell是1979年底在V7 Unix(AT&T第7版)中引入的,并且以它的创始科技部基础条件平台“国家气象网络计算应用节点建设”(2004DKA50730)资助者Stephen Bourne的名字命名。Bourne shell 是一个交换式的命令解释器和命令编程语言。Bourne shell 可以运行为login shell或者login shell的子shell(subshell)。只有login命令可以调用Bourne shell作为一个login shell。此时,shell先读取/etc/profile文件和 H O M E / . p r o f i l e 文 件 。 / e t c / p r o f i l e 文 件 为 所 有 的 用 户 定 制 环 境 , HOME/.profile文件。/etc/profile文件为所有的用户定制环境, HOME/.profile/etc/profileHOME/.profile文件为本用户定制环境。最后,shell会等待读取你的输入。
C Shell
Bill Joy于20世纪80年代早期,在伯克利的加利福尼亚大学开发了C shell。它主要是为了让用户更容易的使用交互式功能,并把ALGOL风格的语法结构变成了C语言风格。它新增了命令历史、别名、文件名替换、作业控制等功能。
Korn Shell
有很长一段时间,只有两类shell供人们选择,Bourne shell用来编程,C shell用来交互。为了改变这种状况,AT&T的bell实验室David Korn开发了Korn shell。ksh结合了所有的C shell的交互式特性,并融入了Bourne shell的语法。因此,Korn shell广受用户的欢迎。它还新增了数学计算,进程协作(coprocess)、行内编辑(inline editing)等功能。Korn Shell 是一个交互式的命令解释器和命令编程语言.它符合POSIX——一个操作系统的国际标准.POSIX不是一个操作系统,而是一个目标在于应用程序的移植性的标准——在源程序一级跨越多种平台。
Bourne Again Shell (bash)
bash是GNU计划的一部分,用来替代Bourne shell。它用于基于GNU的系统如Linux.大多数的Linux(Red Hat,Slackware,Caldera)都以bash作为缺省的shell,并且运行sh时,其实调用的是bash。
POSIX Shell
POSIX shell 是Korn shell的一个变种. 当前提供POSIX shell的最大卖主是Hewlett-Packard。在HP-UX 11.0,POSIX shell 就是/bin/sh,而bsh是/usr/old/bin/sh.
各主要操作系统下缺省的shell:
AIX下是Korn Shell.
Solaris缺省的是Bourne shell.
FreeBSD缺省的是C shell
HP-UX缺省的是POSIX shell.
Linux是Bourne Again shell.
Windows PowerShell是一种新的交互式的命令行和基于任务脚本编写技术,它使信息技术(IT) 管理员能够全面地自动操作和控制系统管理任务,从而提高了管理员的生产力。Windows PowerShell 包括多个系统管理实用工具、一致的语法和命名惯例、及对普通管理数据更好地导航,如登记、证书存储 或 Windows Management Instrumentation (WMI)。Windows PowerShell 还专门针对 IT 管理,提供直观的脚本编写语言。
Shell也是一个VB函数,它的作用是运行程序,语法是Shell(命令字符串[,窗口类型])

shell脚本的执行方式

1)脚本格式
脚本以 #!/bin/bash 开头

第一个shell脚本
需求:输出helloworld

[Qz1997@centos test1]$ sudo touch helloworld.sh
[sudo] password for Qz1997:
[Qz1997@centos test1]$ sudo vi helloworld.sh
[Qz1997@centos test1]$ sudo chmod 755 helloworld.sh
[Qz1997@centos test1]$ ./helloworld.sh
hello world

2)脚本的常用执行方式

第一种:输入脚本的绝对路径或相对路径
(1)首先要赋予helloworld.sh 脚本的+x权限

/root/helloworld.sh
./helloworld.sh

第二种:bash或sh+脚本(不用赋予脚本+x权限)

sh /root/helloWorld.sh
sh helloWorld.sh

shell中的变量

概述

1)Linux Shell中的变量分为“系统变量”和“用户自定义变量”,可以通过set命令查看系统变量。
2)系统变量:$HOME$PWD$SHELL$USER等等
3)显示当前shell中所有变量:set

变量定义规则
(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
(2)等号两侧不能有空格
(3)变量名称一般习惯为大写
(4)双引号和单引号有区别,双引号仅将空格脱意,单引号会将所有特殊字符脱意

定义变量
(1)定义变量:变量=值
(2)撤销变量:unset 变量
(3)声明静态变量:readonly 变量
注意:不能unset

示例
(1)定义变量A

A=8

(2)撤销变量A

unset A

(3)声明静态的变量B=2,

readonly B=2  

(4)可把变量提升为全局环境变量,可供其他shell程序使用

export 变量名

将命令的返回值赋给变量

A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量A
A=$(ls -la) 等价于反引号

设置环境变量

(1)export 变量名=变量值 (功能描述:设置环境变量的值)
(2)source 配置文件 (功能描述:让修改后的配置信息立即生效)
(3)echo $变量名 (功能描述:查询环境变量的值)

位置参数变量

$n	(功能描述:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
$*	(功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@	(功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
$#	(功能描述:这个变量代表命令行中所有参数的个数)

脚本内容

#!/bin/bash

echo "$1"
echo "$2"
echo "$*"
echo "$@"
echo "$#"

执行结果


[Qz1997@centos test1]$ ./b a b
a
b
a b
a b
2

预定义变量

$$		(功能描述:当前进程的进程号(PID))
$!		(功能描述:后台运行的最后一个进程的进程号(PID))
$?		(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)

脚本内容


#!/bin/bash

echo "$$"
./a & # &表示后台执行
./b a b
echo "$!"
echo "$?"

执行结果

./c
7663
a
b
a b
a b
2
7664
0


运算符

1)基本语法:

(1)“$((运算式))”或“$[运算式]”
(2)expr m + n   注意expr运算符间要有空格
(3)expr m - n 注意expr运算符间要有空格
      \*, \, %    乘,除,取余

案例
计算(2+5)X4的值

(1)采用$[运算式]方式
[Qz1997@centos test1]$ S=$[(2+3)*4]
[Qz1997@centos test1]$ echo $S

(2)expr分布计算
S=`expr 2 + 3`
expr $S \* 4

(3)expr一步完成计算
expr `expr 2 + 3` \* 4


条件判断

判断语句
1)基本语法:
[ condition ](注意condition前后要有空格)
2)案例:

[] 	返回false
[param] 	返回true
[condition] && echo OK || echo notok 			条件满足,执行后面的语句

常用判断条件
1)两个整数之间比较

= 字符串比较
-ne 不等于
-le 小于等于
-lt 小于
-eq 等于
-ge 大于等于
-gt 大于



2)按照文件权限进行判断

-r 有读的权限
-w 有写的权限
-x 有执行的权限

3)按照文件类型进行判断

-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在并是一个目录

案例
(1)23是否大于等于22

[ 23 -ge 22 ]

(2)student.txt是否具有写权限

[ -w student.txt ]

(3)/root/install.log目录中的文件是否存在

[ -e /root/install.log ]

流程控制

case语句:
1)基本语法:

case $变量名 in 
  "值1") 
    如果变量的值等于值1,则执行程序1 
    ;; 
  "值2") 
    如果变量的值等于值2,则执行程序2 
    ;; 
  …省略其他分支… 
  *) 
    如果变量的值都不是以上的值,则执行此程序 
    ;; 
esac

2)案例
输入1,输出1;输入2,输出2;输入其他,输出other

!/bin/bash

case $1 in
"1")
        echo "1"
;;

"2")
        echo "2"
;;
*)
        echo "other"
;;
esac

**if判读:**
1)基本语法:
	

```powershell
if [ 条件判断式 ];then 
  程序 
fi 
if [ 条件判断式 ] 
  then 
    程序 
fi
注意事项:(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格

2)案例
判断输入的数是否等于123,是否等于456

#!/bin/bash

if [ $1 -eq "123" ]
then
        echo "123"
elif [ $1 -eq "456" ]
then
        echo "456"
fi





**while循环:**
1)基本语法:

```powershell
	while [ 条件判断式 ] 
  do 
    程序 
  done

2)案例
(1)从1加到100

#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
        s=$[$s+$i]
        i=$[$i+1]
done

echo $s

for循环:

1)基本语法1:

for 变量 in 值123do 
    程序 
  done

2)案例:
(1)打印输入参数

#!/bin/bash
#打印数字

for i in "$*"
    do
      echo "The num is $i "
    done

for j in "$@"
        do
        echo "The num is $j"
        done

3)基本语法2:

	for (( 初始值;循环控制条件;变量变化 )) 
  do 
    程序 
  done

4)案例
(1)从1加到100

#!/bin/bash

s=0
for((i=0;i<=100;i++))
do
        s=$[$s+$i]
done
echo "$s"

read读取控制台输入

1)基本语法:
read (选项) (参数)
选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒)
参数
变量:指定读取值的变量名

在这里插入图片描述

函数

系统函数
1)basename基本语法

	basename [pathname] [suffix]
	basename [string] [suffix]  	(功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
		选项:
		suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
 basename /opt/test.txt 

结果
test.txt

dirname 文件绝对路径		(功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))
 dirname /opt/test.txt

结果
/opt

自定义函数
基本语法:

[ function ] funname[()]
{
	Action;
	[return int;]
}
funname
	注意:
		(1)必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。
		(2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)

案例
(1)计算输入参数的和

#!/bin/bash
function sum()
{
    s=0
    s=$[ $1 + $2 ]
    echo "$s"
}

read -p "Please input the number1: " n1;
read -p "Please input the number: " n2;
sum $n1 $n2;


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值