Shell编程

2021/7/28 7:06:28

本文主要是介绍Shell编程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1、Shell的概念

shell脚本(Shell Script)就是将要执行的命令按照顺序保存到一个文本文件中,并给该文件可执行的权限,方便一次性执行的一个程序文件。

2、快速入门

Linux系统中的Shell脚本是一个特殊的应用程序,它介于操作系统内核与用户之间,充当一个“命令解释器”的角色,负责接受用户输入的操作指令(命令)并进行行解释,将需要执行的操作传递给内核执行,并输入执行结果。
常见的Shell解释器有多种,使用不同的shell脚本时,其内部指令,命令提示等会存在一些区别。
可以通过查看/etc/shells文件可以了解当前系统所支持的Shell脚本的种类。

[root@master ~]# cat /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh

其中 /bin/bash 是目前大多数Linux版本采用的默认Shell脚本。
Bash的全称为 Bourne (目的地)Again Shell。

2.1 创建一个新的脚本(Bash)

创建第一脚本:first.sh
包含的命令为:cd /boot/ ,pwd,ls -lh vml*。

注意事项:一个合格的脚本程序应该遵循标准的脚本结构,能够输出友好的提示信息。

# bin/bash
# 这是我的第一个脚本
cd /boot
echo "当前位置位于:"
pwd 
echo "其中以vml开头的文件包括"
ls -lh vml*

脚本解释:
第一行的# bin/bash 是一行特殊声明方式,表示以后的语句是通过 /bin/bash程序解析执行。
其他的以#开头的语句表示注释信息。
echo命令用于输出字符串。
其他的就是逻辑的命令了。

将脚本赋予可执行的权限:

chmod + x first.sh

可以用两种运行脚本的方式:
方法一:

./first.sh 

方法二:

sh first.sh

执行结果如下:

[root@master myshells]# ./first.sh 
当前位置位于:
/boot
其中以vml开头的文件包括
-rwxr-xr-x. 1 root root 4.1M May 10  2016 vmlinuz-2.6.32-642.el6.x86_64



[root@master myshells]# sh first.sh 
当前位置位于:
/boot
其中以vml开头的文件包括
-rwxr-xr-x. 1 root root 4.1M May 10  2016 vmlinuz-2.6.32-642.el6.x86_64

linux中有大量的Shell脚本文件,如 /etc/init.d 目录下的各种服务控制脚本。

3.管道与重定向

由于Shell脚本“批处理”的特殊性,其大部分操作过程位于后台,不需要用户进行干预。所以学会提取,过滤执行信息很重要。引出两个I/O操作:管道、重定向

3.1 管道操作

管道操作作为不同命令之间协同工作的一种机制。管道操作符 " | " 。
管道操作符左侧的命令输出的结果,将作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。

管道命令的使用规范:

cmdl命令 | cmd2命令 [...| cmdn 命令]

在 Shell脚本应用中,管道操作通常用来过滤所需要的关键信息。配合grep命令使用。

3.2 重定向操作

Linux系统使用文件来描述各种硬件、设备等资源,如以前学过的硬盘和分区、
光盘等设备文件。用戶通过操作系统处理信息的过程中,包括以下几类交互设备文件。

  1. 标准输入( STDIN):默认的设备是键盘,文件编号为0,命令将从标准输
    入文件中该取在执行过程中需要的输入数据。
  2. 标准输出( STDOUT):默认的设备是显示器,文件编号为1,命令将执行
    后的输出结果发送到标准输出文件。
  3. 标准错误( STDERR):默认的设备是显示器,文件编号为2,命令将执行
    期间的各种错误信息发送到标准错误文件。

标准输入、标准输出和标准错误默认使用键盘和显示器作为关联的设备,与操作
系统进行交互,完成最基本的输入、输出操作。从键盘接收用戶输入的各种命令字串、
辅助控制信息,并将命令结果输出到屏幕上;如果命令执行出错,也会将错误信息反馈到屏幕上。

在实际的使用中,可以改变输入、输出内容的方向,而不使用默认的标准输入,输出设备。这种操作就是重定向

3.2.1 重定向输入

重定向输入:是将命令中接收输入的途径有默认的键盘改为指定的文件。而不是等待键盘输入。重定向输入使用 “ < ”操作符。重定向输入用途不多。

3.2.2 重定向输出

重定向输出是指,将命令正常的输入结果保存到指定文件中,而不是直接显示在屏幕上。
重定向输入使用“ >”,或者“>>” 分别代表覆盖和追加。

若重定向的输入的文件不存在时,创建新的文件,将前面的命令的输出结果保存到该文件中。
若重定向的文件存在,则就根据 “ >”,或者“>>” 对输出结果进行 覆盖或者追加到文件中。

例如:正常执行 ./first.sh 脚本

[root@master myshells]# ./first.sh 
当前位置位于:
/boot
其中以vml开头的文件包括
-rwxr-xr-x. 1 root root 4.1M May 10  2016 vmlinuz-2.6.32-642.el6.x86_64

当执行 ./first.sh > pass ,没有输出结果。将文件保存到pass中

[root@master myshells]# ./first.sh  > pass
[root@master myshells]# 

执行cat pass 查看文件

[root@master myshells]# cat pass 
当前位置位于:
/boot
其中以vml开头的文件包括
-rwxr-xr-x. 1 root root 4.1M May 10  2016 vmlinuz-2.6.32-642.el6.x86_64

当执行 ./first.sh >> pass ,没有输出结果。将文件保存到pass中。会将输出结果,追加在文件末尾。

3.2.3 错误重定向

错误重定向是将执行命令过程中出现的错误信息(如选项,参数错误等信息)保存到指定文件中,而不是直接输出到屏幕中。
错误重定向使用“ 2>”操作符,其中“2”是指错误文件的编号。(在使用标准输出,输入重定向时,实际省略了1,0编号)“2>>”追加模式

4. 变量

常见变量分为四种:自定义变量,环境变量,位置变量,预定义变量。

4.1 自定义变量

自定义变量是由系统用户自己定义的变量。只在用户自己的Shell环境中有效,因此又称本地变量。

4.1.1 定义新变量

在定义一个新的变量时,一般不需要提前声明,而是直接指定变量名,直接赋值即可。

#!/bin/bash
#定义变量,等号的左右两边不要有空格。
product=微信
version=12.0

在这里定义一个变量 product 值为 微信 version值为12.0 。

4.1.2 查看和引用变量值

通过在变量名称前面添加“$”,可以引用一个变量的值,使用echo命令可以查看变量,可以在echo命令中查看多个变量值。

#!/bin/bash
#定义变量
product=微信
version=12.0
echo $product
echo $version
echo $product$version 
~                          

执行结果为 :

[root@master myshells]# ./sec 
微信
12.0
微信12.0

当变量名称容易和紧跟其后的字段名称相混淆时,需要添加大括号“{ }” 将其括起来,否则将无法确定正确的变量名称。
对于未定义的变量,将显示为空值。

#!/bin/bash
#定义变量
product=微信
version=12.0
echo ${product} 33333 ${version}    #在product后面拼接了33333
[root@master myshells]# ./sec 
微信 33333 12.0

4.1.3 变量赋值的特殊的操作

在等号“ = ”后边直接指定变量内容为变量赋值的基本方法,除此之外,还有些特殊的赋值操作。

(1) 双引号(“ ” )

双引号主要起界定字符串的作用,特别是当赋值的内容中包含空格时,必须以双引号括起来;其他情况,双引号可以省略。
例如:若要将 weixin 5.0 赋值给变量weixin 则要值用双引号括起来。

[root@master myshells]# weinxin=weinxin 5.0 
	 # 错误i的赋值
-bash: 5.0: command not found
[root@master myshells]# echo $weinxin  #正确的赋值
weinxin 5.0

在双引号范围内,使用“$”符号可以引用其他的变量值,从而能够直接调用现有变量的值来赋给新的变量。
例如:

[root@master myshells]# version=8.0
[root@master myshells]# QQ="QQ$version"
[root@master myshells]# echo $QQ
QQ8.0

(2)单引号( ’ )

当要赋值内容包含 “ $ ”,“ ”,” ** “ 特殊的转义含义的字符时,应使用单引号括起来。在单引号的范围内,将无法引用其他的变量的值,任何字符均作为普通字符看待。但赋值内容中包含单引号时,需使用” ** “符号进行转义,以免冲突。

[root@master myshells]# QQ='QQ$version' #$符号不能在引用变量
[root@master myshells]# echo $QQ  #输出原来的字符串
QQ$version

(3)反撇号 ( ` )

反撇号主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量。反撇号括起来的范围必须时能够执行的命令行,否则将会出错。

(4)read命令

read命令是Bash的内置命令,可以给变量赋值。
read命令还可以用来提示用户提示信息,从而实现简单的交互过程。

read命令还可以结合 "-p"选项设置相应的提示信息。

[root@master myshells]# read -p "请指定备份目录:" tofile
请指定备份目录:/opt/module
[root@master myshells]# echo $tofile
/opt/module
(5)数值变量的运算

Shell变量的数值运算多用于脚本程序的过程控制(循环次数,等)。在Bash Shell环境中,只能进行简单的整数运算,不支持小数运算。

整数值的运算主要通过内部命令expr进行,(expr)是表达式的意思。
基本格式:

expr 变量1 运算符 变量2 【运算符 变量3】·····

其中,变量1、变量2 … 对应为需要计算的数字变量(需要以” $ “符号调用。
使用方法与大部分高级语言相似

注意:
乘法: *
不等于:! = #有空格
条件表达式:? : #有空格

[root@master myshells]# x=35
[root@master myshells]# y=35
[root@master myshells]# expr $x + $y
70

[root@master myshells]# expr $x \* $y
1225

4.2位置变量

为了在使用Shell脚本程序时,方便通过命令行为为程序提供操作参数。引出位置变量。
当执行命令行操作时,第一个字段表示命令名或者脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。
位置变量也称为位置参数,使用$1、$2、…$9表示。

5. 条件语句

5.1 if语句

(1)单分支if语句

语法格式:

if 条件

	 then 	命令序列

fi

单分支if语句的执行流程:首先判断条件的结果,如果返回值为0表示条件成立,则执行then后面的命令序列,一直遇到fi结束判断为止,继续执行其他脚本代码。如果返回值不为0,则忽略then后面的命令序列,直接跳至fi行以后执行。

在这里插入图片描述

(2)双分支if语句

双分支if语法格式

if 	条件判断
then
	命令序列
else
	命令序列2
fi

在这里插入图片描述

(3)多分支if语句

if 条件
then
 	命令序列1
elif 条件
 
then 
 	命令序列2
else
 	命令序列3
 fi	

在这里插入图片描述



这篇关于Shell编程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程