Shell脚本编程

1.shell介绍
  • Shell的概念是源自Unix的命令解释器。Shell不仅可解释用户输入的命令,同时可解释执行基于命令的脚本语言。
  • 使用shell脚本能提高用户操作和管理员进行系统管理的效率
  • shell脚本擅长处理纯文本类型的数据,而Linux中几乎所有的配置文件、日志都是纯文本类型

脚本书写规范:
(1)脚本统一存放目录
(2)选择解释器 开头 #! 内核根据#!后的解释器来确定用哪个解释器解释脚本内容
#!/bin/bash——指定脚本默认的解释程序
(3)编辑脚本使用vim 可以配置~/.vimrc
(4)文件名规范,结尾以sh结束

2. shell脚本编程的一般步骤

(1)编辑文件;
(2)保存文件;
(3)将文件赋予可执行的权限;
(4)运行及排错。

※ 实例:使用vi编辑器建立一个hello.sh
(1)输入 vi hello.sh ,打开编辑器
(2)输入:
    #!/bin/bash
     echo "hello world!"
(3):wq 保存退出
(4)给文件授予可执行权限
sh hello.sh 或 ② bash hello.sh 或 ③ chmod 755 hello.sh (chmod u+x hello.sh) , ./hello.sh
(5)运行在屏幕上输出“hello world!”
在这里插入图片描述

3.Shell脚本的基本元素
  • #!/bin/bash:指出shell的类型,默认使用/bin/bash
  • # 注释:注释语句可以增加程序的可读性
  • 变量:通过变量保存相关信息
  • 控制:包括控制语句,有的脚本里面还有函数等

※ 一个shell脚本模板 abc.sh
在这里插入图片描述
命令:
在这里插入图片描述
注意:
①执行方式./文件名是在当前目录下执行,要求文件必须有执行权限,如chmod 755 run.sh,./run.sh。
②文件开头指定一个或多个解释脚本程序的shell,如#!/bin/bash。如果指定,注意/bin不要漏了“/”,否则用./方式执行会找不到路径。不指定的话一般默认以/bin/sh执行shell脚本,执行时只能用sh或bash执行

4.shell中的常用符号和变量

(1)注释符 #
除了#!/bin/bash里的#特殊,剩余的#都表示注释。
(2)美元符 $
变量符。与反斜杠转义符相反,使其后的普通字符作为变量名,如$a表示变量a的值。变量字符长度超过1个时,用{}括起来。
(3)单引号
被单引号引起的字符全部做普通字符,即全部原样。
echo ‘my $SHELL’ 输出结果为:my $SHELL
(4)双引号
双引号内引起的内容,除$、转义符\、倒引号`这三个保留特殊功能,其他字符均做普通字符。
(5)倒引号(数字1键旁边的那个键)
倒引号内的字符串当做shell命令行解释执行,得到的结果取代整个倒引号括起来的部分。
(6)反斜线
反斜线是转义字符,它能把特殊字符变成普通字符。在某个字符前面利用反斜杠(\)能够阻止shell把后面的字符解释为特殊字符。
举例:$ echo “Filename is N0$*”,输出结果Filename is N0$*

//区分下面的语句
[flora@localhost ~]$ echo 'my home is $HOME'
my home is $HOME
[flora@localhost ~]$ echo "my home is $HOME"
my home is /home/flora
[flora@localhost ~]$ echo `my home is $HOME`
bash: my: 未找到命令...
文件搜索失败: Cannot update read-only repo

[flora@localhost ~]$ echo "my home is `pwd`"
my home is /home/flora
[flora@localhost ~]$ echo 'my home is `pwd`'  //双倒引号则显示原字符串
my home is `pwd`

//针对*不加双引号与加双引号的比较
[flora@localhost ~]$ x=*
[flora@localhost ~]$ echo $x     //显示当前目录下的所有文件
1 公共 模板 视频 图片 文档 下载 音乐 桌面 abc.sh a.sh fd friends hello.sh Music Pictures test test1 test2 test3 test.txt Vidoes vitest
[flora@localhost ~]$ echo "$x"   //仅显示变量x的值'*'
*
5.shell的变量
  • 环境变量:可以在创建它们的Shell及其派生出来的任意子程序中使用。有些变量是用户创建的,其他的则是专用的(比如PATH、HOME)是系统环境的一部分,不必去定义它们,可以在shell程序中使用它们 。还能在shell中加以修改。
  • 预定义变量:由系统提供的。与环境变量不同,用户不能修改它们。
  • 用户变量:只在创建它们的Shell中使用,可以在shell程序内任意使用和修改它们。
Ⅰ.环境变量

(1)设置环境变量
通常设置环境变量大写,具体格式如下:
variable-name=value
export variable-name
或直接
export variable-name=value 即可
在这里插入图片描述
(2)显示环境变量
使用env 可以查看系统中所有的环境变量
查看某一个环境变量使用格式:echo $环境变量名
例如 echo $HOME //显示当前用户的家目录
(3)清除环境变量
环境变量可以在命令行中设置,但用户注销时这些值将丢失。如果想要永久保存环境变量,需要将其写入相关配置文件(~/.profile)中。
命令行中清除环境变量可以使用如下格式:unset 环境变量名
在这里插入图片描述
❣ 修改环境变量可以用 PATH=$PATH:需添加的目录,示例如下图:
在这里插入图片描述

(4) 配置文件中修改环境变量
①注意:修改环境变量前最好先备份一下旧的:
export tem=$PATH
echo $tem >>pathbake
②需要知道环境变量与哪些配置文件有关:
不同发行版会有不同,但命名还是有通性的:
find / -name “*profile”
find / -name “*bashrc”

全局配置文件/etc/profile
本地配置文件~/.bashrc
(5)常用环境变量

  • HOME:用于保存当前用户主目录
  • PATH:用于保存用冒号分隔的目录路径名,shell将按PATH变量中给出的顺序搜索
  • SHELL:指当前用户用的那种SHELL
  • LOGNAME:指当前用户的登录名
  • HISTSIZE:指保存历史命令记录的条数
  • PS1:保存shell用来提示用户输入命令的提示字符串,默认超级用户是#,普通用户是$
Ⅱ 预定义变量

  预定义变量是Linux所提供的一种特殊类型的变量,这类变量在程序中用来作出判断。在shell程序内这类变量的值是不能修改的。
※ 部分预定义变量的含义如下:
$# ——传送给shell程序的位置参数的数量
$?——最后命令的完成码或者在shell程序内部执行的shell程序(返回值)
$0——shell程序的名称
$*——调用shell程序时所传送的全部参数的单字符串, “参数1”“参数2”…形式保存的参数
$@ ——“参数1”“参数2”…形式保存的参数
$n ——第n个参数
$$ ——本程序的PID
$!—— 上一个命令的PID

测试:
在这里插入图片描述
在这里插入图片描述

Ⅲ 用户变量

(1)设置本地变量

  • 给变量赋值时,等号两边不能有空格,变量区分大小写字母,
  • 格式:变量名=值
  • 注意:取值包含空格时,必须用引号(单引号或双引号)括起来。
  • 例如定义一个值为hello world的变量var,可以使用格式如下:
    var=’hello world’
    var=”hello world”

(2)引用变量

  • Shell中使用$来引用变量,若输出var变量的内容,可以使用如下方式:echo $varecho ${var}
  • 变量名为1个字符时建议使用方式一,多于一个字符时建议使用方式二,防止发生歧义。
6.shell的高级应用

(1)花括号{ }
  通过花括号扩展可以生成需要的字串,花括号中可以包含连续的序列或使用逗号分隔的多个项目,连续的序列包括一个起点和一个终点。

//使用花括号输出字符串序列
[flora@localhost ~]$ echo {a,b,c}
a b c
[flora@localhost ~]$ echo {0..9}
0 1 2 3 4 5 6 7 8 9
[flora@localhost ~]$ echo user{1,2,3}
user1 user2 user3

//使用花括号扩展创建名称相关的目录
[flora@localhost ~]$ mkdir {dir1,dir2,dir3}
[flora@localhost ~]$ ls -ld dir{1,2,3}
drwxrwxr-x. 2 flora flora 6 3月  28 21:26 dir1
drwxrwxr-x. 2 flora flora 6 3月  28 21:26 dir2
drwxrwxr-x. 2 flora flora 6 3月  28 21:26 dir3

(2)通配符
在bash中有三种常见的通配符“*”、“?”、“[ ]”

  • * ”代表任何字符
  • “ ? ”代表任何单个字符
  • “ [ ] ”代表一个字符范围,只要文件名中“[ ]”位置处的字符在“[ ]”范围内,那么这个文件名就与这个模式串匹配。例如,[abcdef] 可以是a b c d e f 中的任意一个字母当然也可以是数字。[-]代表的是一个范围,例如 [a-z] 表示的是字母a到z之间的所有字母。
  • [^],^是反向选择符号,从字面意思可以知道也就是非的意思,例如,[^abc]表示只要不是a b c 这三个字符中的任意一个就选择。

(3)命令替换符
$( )可以将命令替换输出赋值给变量。
例如,通过命令替换获得当前日期并用它来生成唯一文件名
如下图,这是提取日期信息来生成日志文件名常用的一种技术。
在这里插入图片描述
执行脚本后,浏览可以看到生成的文件。
在这里插入图片描述
(4)算术扩展运算符
Shell中使用$((expression))算术运算扩展符,可将$((expression))作为参数传递给命令或者替换命令行上的任意数值。expression的构成规则与C语言的规则相同,所有标准C算术运算符都可以使用,
在这里插入图片描述
示例:

[flora@localhost ~]$ $((1+2))
bash: 3: 未找到命令...
[flora@localhost ~]$ echo $((1+2))  
3
[flora@localhost ~]$ m=$((1+2))
[flora@localhost ~]$ echo $m
3
//注意:算术扩展运算符不能单独使用,需放入语句中使用。
7.基本输入输出及控制语句
(1)read命令

shell脚本中通过echo关键字打印变量,通过read关键字读取变量。当脚本需要从命令行中输入数据时,可以使用read语句:read [选项] 变量名。
在这里插入图片描述
具体实例可以看此链接:https://www.runoob.com/linux/linux-comm-read.html

(2)条件测试

方法1:使用test命令    语法:test 条件表达式
方法2:使用括号[]     语法:[ 条件表达式 ]   ps:方括号的内侧两边各需一个空格
注意:
①如果测试条件为真,test命令会返回0,否则返回一个非0的数值,条件表达式的值为真返回零,为假时返回非零值
②test 语句与if/then和case语句一起,构成shell编程的控制转移结构
③Shell还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:"!“最高,”-a"次之,"-o"最低。

A.文件测试
在这里插入图片描述
示例:删除文件时先测试文件是否存在,若存在则删除。
在这里插入图片描述
在这里插入图片描述
B.数字比较
在这里插入图片描述
示例:
在这里插入图片描述
在这里插入图片描述
注意:代码中的 [] 还可以执行基本的算数运算,如下图
在这里插入图片描述
在这里插入图片描述
C.字符串比较
在这里插入图片描述
测试:

[flora@localhost ~]$ name="john"
[flora@localhost ~]$ test "$name" = john
[flora@localhost ~]$ echo $?
0
[flora@localhost ~]$ test "$name" != john
[flora@localhost ~]$ echo $?
1
[flora@localhost ~]$ [ "$name" != john ]
[flora@localhost ~]$ echo $?
1
[flora@localhost ~]$ [ "$name" = john ]
[flora@localhost ~]$ echo $?
0

[flora@localhost ~]$ test -z "$name"
[flora@localhost ~]$ echo $?
1
[flora@localhost ~]$ test -n "$name"
[flora@localhost ~]$ echo $?
0

(3)分支控制语句

A.if条件语句
分为:单分支if语句、双分支if语句和多分支if语句
Ⅰ.单分支if语句
格式如下:
if [ 条件表达式 ]
then
命令序列
fi
Ⅱ. 双分支if语句
格式如下:
if [ 条件表达式 ]
then
命令序列1
else
命令序列2
fi
Ⅲ. 多分支If语句
多分支if语句可以出现不止一个的条件判断,格式如下:
if [ 条件表达式1 ]; then
命令序列1
elif [ 条件表达式2 ]; then
命令序列2
else
命令序列3
fi
B. case语句
case语句可以将一个变量的内容与多个选项进行匹配,若匹配成功,则执行该条件下匹配的语句。
格式如下:
case <变量> in
字符串1) 命令序列1;;

字符串n) 命令序列n;;
*) 其他;;
esac

示例:根据系统当前的时间向用户输出问候信息

#!/bin/bash
hour=`date +%H`  //也可以使用hour=$(date+%H)
case $hour in
	0[1-9]|1[01])
		echo "Good morning!";;
	1[2-7])
		echo "Good afternoon!";;
	*)
		echo "Good evening!";;
esac
(4)循环控制语句

Shell脚本中常用的循环有for循环、while循环和until循环。
Ⅰ.for 循环
for循环常见的语法格式如下:
语法1:
for 变量名 in 参数列表
do
命令列表
done

语法2:
for ((初始化变量值;结束循环条件;运算))
do
命令序列
done

示例:

#!/bin/bash
#利用for循环将paper pencil pen输出在屏幕上
for x in paper pencil pen;
do
	echo "The value of variable x is:$x"
	sleep 1
done
#利用for循环计算1-100之间的和
for((i=1;i<=100;i++))
do
	sum=$((sum+i))
done
echo "sum=$sum"
#利用for循环计算1-100间的和(这里用到了seq命令,可快速产生序列)
for i in `seq 1 100`
do
	sum1=$((sum1+i))
done
echo "sum1=$sum1"


结果为:
[flora@localhost ~]$ sh abc.sh
The value of variable x is:paper
The value of variable x is:pencil
The value of variable x is:pen
sum=5050
sum1=5050

Ⅱ.while循环
格式如下:
while [ 条件表达式 ]
do
命令列表
done
示例:循环输出num(从1-20)
在这里插入图片描述
Ⅲ.until循环
格式如下:
until [ 条件 ]
do
命令序列
done
until循环与while循环的格式基本相同,不同的是until循环直到条件满足时循环结束。
在这里插入图片描述

(5)函数

函数是一个语句块,完成相对独立的功能

  • 函数的语法形式如下:
    函数名( )
    {
    命令列表;
    }
  • 函数的调用方式为:函数名 [ 参数列表 ]
  • 是否需要参数由函数的定义和功能决定,参数与参数之间用空格分割。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值