自学内容网 自学内容网

Linux---shell脚本

文章目录


前言

希望通过本文的学习,你能够掌握Shell脚本的基本知识和实用技巧,将Shell脚本融入到你的日常工作中,成为你提高工作效率、实现自动化任务的得力助手。让我们一起踏上这段探索Shell脚本的旅程,开启一段充满无限可能的自动化之旅吧!


一.Shell脚本定义

Shell以文本方式提供了与操作系统内核进行交互的方式。用户可以在shell脚本文件中写入一系列系统命令,然后执行shell脚本就可以自动执行脚本文件中的命令从而节省大量时间。

Shell可以帮助用户高效地执行一系列命令和任务。通过学习和掌握Shell脚本的编写技巧,用户可以大大提高工作效率和自动化水平。

shell脚本书写规范

  1. 脚本命名
    • 脚本名应以.sh结尾,名称应尽量具有描述性,如ClearLog.shSerRestart.sh等。
  2. 编码格式
    • 尽量使用UTF-8编码,注释及输出尽量使用英文。
  3. 执行权限
    • 一般应给予脚本执行权限,但一些仅用于变量定义的配置文件则无需加执行权限。
  4. 解释器声明
    • 脚本首行应使用#!/bin/bash(或#!/usr/bin/env bash)来声明解释器,没有空格,不带任何选项。

下面是一个简单的脚本案例:

#创建一个以.sh结尾的shell脚本文件
[root@localhost sh]# vim test_1.sh
首行添加解释器声明,在此之后可以添加需要执行的命令
#!/bin/bash
【添加需要执行的命令】

#添加完脚本内容后给脚本添加执行权限
[root@localhost sh]# chmod u+x test_1.sh

 shell脚本执行方式

直接运行脚本

  1. 方法描述
    • 在终端中输入脚本文件的路径并按下回车键即可执行脚本。
    • 例如,如果脚本文件名为script.sh,并且位于当前目录下,则可以在终端中输入./script.sh来执行该脚本。
  2. 特点与要求
    • 需要确保脚本文件具有可执行权限
    • 可以使用chmod命令来设置脚本的权限,如chmod +x script.sh
    • 脚本文件的第一行通常包含Shebang(如#!/bin/bash),用于指定解释器。
#利用路径的方式执行一下脚本
[root@localhost sh]# ./test_1.sh
#若无执行权限会出现如下报错:
-bash: ./test_1.sh: 权限不够

#提示“权限不够”代表当前用户无执行权限,需要添加权限
[root@localhost sh]# chmod u+x test_1.sh

 使用shell解释器执行

  1. 方法描述
    • 通过显式地指定Shell解释器来执行脚本。
    • 例如,使用bash script.shsh script.sh来执行脚本。
  2. 特点与要求
    • 不需要脚本文件具有可执行权限
    • 可以选择不同的Shell解释器,如bash、sh、zsh等。
    • 适用于不同Shell环境,提高了脚本的兼容性。
[root@localhost sh]# bash test_1.sh

[root@localhost sh]# sh test_1.sh

shell脚本退出状态码 

在UNIX或者Linux中,每个命令都会返回一个退出状态码。退出状态码是一个整数,其有效范围为0~255。通常情况下,成功的命令返回0,而不成功的命令返回非0值。

Shell脚本中的函数和脚本本身也会返回退出状态码。在脚本或者是脚本函数中执行的最后的命令会决定退出状态码。另外,用户也可以在脚本中使用exit语句将指定的退出状态码传递给Shell。

通常退出状态码记录在$?中,且$?只记录刚刚执行过的命令的返回值。

 二.Shell变量

顾名思义,变量就是程序设计语言中的一个可以变化的量,从本质上讲,变量就是在程序中保存用户数据的一块内存空间,而变量名就是这块内存空间的地址。 

变量定义

定义规范

定义变量有以下几点需要注意: 

  • 变量名可以包含下划线,数字,大小写字母,但不能以数字开头。
  • "="两边不要有空格。
  • “值”如果含有空格,要使用单引号' '或双引号“ ”引起来
  • 定义变量时,变量名前是不需要加$的,引用变量时需要在变量名前加$

常见定义错误如下:

变量名不能以数字开头,所以会报错
[root@localhost ssh]# 1aa=123
bash: 1aa=123: command not found...

变量名只能以数字,字母,下划线组合,所以报错
[root@localhost ssh]# aa-1=123
bash: aa-1=123: command not found...

等号右边有空格,所以报错
[root@localhost ssh]# aa=1 2
bash: 2: command not found...

  正常的变量定义如下:

[root@localhost ssh]# a=123
[root@localhost ssh]# echo $a
123

定义方式

基本定义式

格式如下:

变量=值
[root@localhost ssh]# a=123
[root@localhost ssh]# echo $a
123

  命令结果定义式

格式如下:

变量=$(命令)

例如,定义一个名称是IP的变量,对应的值是ens160的IP,命令如下:

[root@localhost ~]# IP=$(ifconfig ens160 | awk '/inet /{print $2}')
[root@localhost ~]# echo $IP
192.168.23.143

 交互式定义

使用read命令从用户输入中获取变量的值。这种方法通常用于需要用户输入的场景。

格式如下:

read -p '提示信息' 变量

 当执行read命令时,系统会提示用户输入一些内容,所输入的值会赋值给read后面的变量,这里我们输入的是123,所以打印a变量时看到的是123。

[root@localhost ~]# read -p "请输入数字:" a
请输入数字:123
[root@localhost ~]# echo $a
123

 变量的运算

运算表达式

在Shell脚本中,运算表达式用于执行数值计算或逻辑判断,是脚本实现自动化处理的基础。下面是一些常见的运算表达式:

$[ ],(()),let用于整数运算
declare定义变量值和属性,-i参数可以用于定义整形变量,做运算
bc支持浮点运算

如果不用这样的表达式,看如下代码:

[root@localhost ~]# echo 2+3
2+3

 这里并不会计算2+3,而是直接把这3个字符打印出来了,正确的做法如下:

[root@localhost ~]# echo $[2+3]
5

[root@localhost ~]# let a=2+3
[root@localhost ~]# echo $a
5

 想要实现定义aa变量为整数类型,然后再做数学运算,命令如下:

[root@localhost ~]# declare -i aa
[root@localhost ~]# aa=3/2
[root@localhost ~]# echo $aa
1

 首先declare -i aa 把aa定义为一个整数,所以3/2等于1.5取整数1,然后赋值给aa,所以aa的值为1。以上表达式不能求得小数,如果想要得到小数要使用bc命令,用法如下:

echo "scale=N ; 算法" | bc

 这里的N是一个数字,表示小数点后面保留几位。

 练习1:计算2/3,小数点后面保留3位

[root@localhost ~]# echo "scale=3 ; 2/3" | bc
.666

 这里得到的结果是0.666,整数部分0没有显示。

算数运算:

+,-,*,/,**,%表示加法;减法;乘法;除法;次方;取余

 比较运算:

-eq,-ne,-gt,-ge,-lt,-le相等,不等;大于,大于等于;小于,小于等于

 练习1:判断1等于2,命令如下:

[root@localhost ~]# [1 -eq 2 ]
bash: [1: command not found...
[root@localhost ~]# echo $?
127

 1是不能等于2的,所以判断不成立,返回值是非零值。

练习2:判断1不等于2,命令如下:

[root@localhost ~]# [ 1 -ne 2 ]
[root@localhost ~]# echo $?
0

1不等于2,所以判断成立,返回值为0。 

赋值运算

=,+=,-=,*=,/=,%=直接赋值,(加/减/乘/除/取余)等于

 逻辑运算

字符串比较运算

字符串比较一般是比较两个字符串是否相同,用到较多的比较符有以下两种:

==相同
!=

不相同

 做完比较之后,通过返回值来判断比较是否成立。

练习1:定义一个变量aa=tom,然后做判断,命令如下:


未完待续.......


原文地址:https://blog.csdn.net/zhoutong2323/article/details/143818110

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!