Linux系统配置(shell基础)

目录

前言

一、编写shell

1、格式和运行

2、操作符号

3、当前变量

4、全局变量

5、永久变量

6、自定义变量

7、加法脚本

8、整数运算

9、系统变量

10、位置参数与预定义变量

11、打包备份脚本

12、测试操作

13、整数值对比

14、操作符

二、分支语句

1、单分支if语句

2、双分支语句

3、多分支语句

4、case格式多分支语句

结语


前言

     在进行linux系统维护时,重复性输入和交互式操作费时费力,可以通过编写shell脚本批量处理、自动化的完成一系列任务,减轻负担,shell多用于自动化部署、系统巡检和日志分割

一、编写shell

1、格式和运行

查看系统shell

cat /etc/shells

创建简单shell

[root@pc1 ~] vi shell.sh

添加如下内容
#!/bin/bash
echo "home目录下有以下文件"
cd /home
ls
echo "当前目录位置"
cd -

以下三种方法可运行shell

./文件 需要执行权限(chmod +x 文件)

sh 文件或/bin/bash 文件或bash 文件

source 文件或. 文件

2、操作符号

<          从指定文件读取数据
>          将shell脚本正确信息运行后输出结果保存到指定文件(覆盖)
>>        将shell脚本正确信息运行后输出结果保存到指定文件(追加)
2>        将shell脚本运行后其中的错误信息保存到指定文件(覆盖)
2>>      将shell脚本运行后其中的错误信息保存到指定文件(追加)
&>        将输出结果和错误信息保存到指定文件

3、当前变量

     变量的作用

  • 用来存放系统和用户需要使用的特定参数(值)
  • 变量名:使用固定的名称,由系统预设或用户定义
  • 变量值:能够根据用户设置、系统环境的变化而变化

     变量的类型

  • 自定义变量:由用户自己定义、修改和使用
  • 特殊变量:环境变量,只读变量,位置变量,预定义变量

当前变量(重启或bash或切换shell或切换用户后失效)

变量名=变量值
echo $变量名                        查看变量
echo $变量名1 $变量名2      查看多个变量

readonly 变量名                     设为只读变量

a=1.txt
touch $a相当于touch1.txt

lq='ls -lash'
$lq相当于ls -lash

4、全局变量

全局变量(bash或切换shell或切换用户后仍生效,重启失效)
export a=1.txt

a=1.txt
export a

5、永久变量

永久变量
在/etc/profile文件内容中添加变量可永久生效

[root@pc1 ~]# a=1.txt

echo "$a"
echo后面"$a"表示引用a的变量,输出结果为1.txt
echo '$a'
echo后面'$a'表示输出固定字符,输出结果为$a
echo `ls -la`或echo $(ls -la)
echo后面`ls -la`或$(ls -la)表示输出命令结果,相当于运行命令


[root@pc1 ~] echo '$a'"$a"bc
$a1.txtbc

6、自定义变量

可自定义输入变量
[root@pc1 ~] read -p "提示信息" a
提示信息 1
[root@pc1 ~] echo $a
1

7、加法脚本

[root@pc1 ~]# vi shell.sh
#!/bin/bash
echo "加法运算"
read -p '第1个数:' a1
read -p '第2个数:' b
read -p '第3个数:' c
echo '结果:' `expr $a1 + $b + $c`

[root@pc1 ~]# sh shell.sh
加法运算
第1个数:12
第2个数:12
第3个数:12
结果: 36

8、整数运算

加法
[root@pc1 ~] expr 1 + 2
3

减法
[root@pc1 ~] expr 10 - 7
3

乘法
[root@pc1 ~] expr 2 \* 5 (使用乘号时,必须用反斜线,因为默认*代表全部而不是乘号)
10

除法
[root@pc1 ~] expr 10 / 2 / 5
1

取除法余数
[root@pc1 ~] expr 5 % 3
2

9、系统变量

PWD          用户当前路径
PATH         系统的路径变量(可执行命令路径,即为命令执行时查找的路径范围)
USER        当前登录用户
SHELL       当前用户使用的shell环境
HOME        当前用户的宿主目录

10、位置参数与预定义变量

位置参数变量
$数字          数字范围0~9,代表第几个位置参数,$0为当前程序进程或文件的名称

预定义变量
$#              命令行中位置变量个数
$*               所有位置变量的内容
$?               上一条命令执行后返回的状态,返回值为0表示执行正常,非0表示执行异常或出错

11、打包备份脚本

创建打包备份脚本
[root@pc1 ~]# vi shell.sh
添加如下内容
#!/bin/bash
a=beifen-`date +%F_%H·%M`.tar.gz
tar -zcf $a $* &> /root/3.txt
echo "已执行$0脚本"
echo "共完成$#个备份"
echo "具体内容包括:$*"

使用脚本备份文件
[root@pc1 ~]# sh shell.sh 1.txt 2.txt
已执行shell.sh脚本
共完成2个备份
具体内容包括:1.txt 2.txt

[root@pc1 ~]# ll
-rw-r--r--  1 root root  147 2月  10 21:10 beifen-2022-02-10_21·10.tar.gz

12、测试操作

条件测试
[root@pc1 ~]# test 条件表达式或[ 条件表达式 ]
[root@pc1 ~]# echo $?


文件测试
[root@pc1 ~]# [ 操作符 文件或目录 ]

常用的测试操作符
-d            测试是否为目录
-e            测试目录或文件是否存在
-f             测试是否为文件
-r             测试当前用户是否有权限读取
-w           测试当前用户是否有权限写入
-x            测试当前用户是否有权限执行

[root@pc1 ~]# [ -d 文件 ]
[root@pc1 ~]# echo $?
1
[root@pc1 ~]# [ -d 目录 ]
[root@pc1 ~]# echo $?
0

13、整数值对比

[ 整数1 操作符 整数2 ]

常用的测试操作符
-eq           等于(Equal)
-ne           不等于(Not Equal)
-gt            大于(Greater Than)
-It             小于(Lesser Than)
-le            小于或等于(Lesser or Equal)
-ge           大于或等于(Greater or Equal) 

[root@pc1 ~]# [ 3 -eq 3 ]
[root@pc1 ~]# echo $?
0
[root@pc1 ~]# [ 3 -ne 3 ]
[root@pc1 ~]# echo $?
1

[root@pc1 ~]# [ 1 -eq 2 ] || echo "budengyu"
budengyu
[root@pc1 ~]# [ 1 -eq 1 ] && echo "dengyu"
dengyu


[root@pc1 ~]# mem=`free -m|grep Men: | awk '{print $7}'`
[root@pc1 ~]# [ $mem -ge 1000 ]&&[ $mem -le 2000 ]&&echo 可用内存大于1000MB小于2000MB,当前内存为:"$mem"MB
可用内存大于1000MB小于2000MB,当前内存为:1182MB


等于
[ 数字1=数字2 ]

不等于
[ 数字1!=数字2 ]

字符串为空
[ -z 字符串 ]

14、操作符

在命令操作中
&& 表示前一条命令执行成功或正确时,才执行后一条命令
|| 表示上一条命令执行失败或错误后,才执行下一条命令

在测试命令符中
-a或&&            与,两者都要满足
-o或||                或,两者满足一个即可
!                        非,不满足

[root@pc1 ~]# ll
-rw-r--r--  1 root root    0 2月  11 16:04 a
[root@pc1 ~]# [ ! -d a ]&&mkdir b                不存在目录a就创建目录b(通常是不能存在某个文件或目录就创建某个文件或目录)
[root@pc1 ~]# ll
-rw-r--r--  1 root root    0 2月  11 16:04 a
drwxr-xr-x  2 root root    6 2月  11 16:06 b

二、分支语句

1、单分支if语句

如果目录/root/a不存在就创建目录/root/a
编辑shell内容如下
#!/bin/bash
a=/root/a
if [ ! -d $a ]
   then mkdir $a
fi

2、双分支语句

else表示如果then不成立则
编辑shell内容如下
#!/bin/bash
read -p '是否安装(yes或no):' a
if [ $a = yes ]
   then echo 安装成功
   else echo 安装失败
fi

检测主机是否可ping通
编辑shell如下(ping -c表示发送测试包数量 -i表示间隔时间多少秒,-W表示超时时间多少秒)
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &>/dev/null
if [ $? -eq 0 ]
   then echo 主机$1可以ping通
   else echo 主机$1无法ping通
fi

检测服务端口是否开启
编辑shell如下
#!/bin/bash
netstat -naput|grep $1 &>/dev/null
if [ $? -eq 0 ]
   then echo $1端口正在运行
   else echo $1端口没有运行
fi

3、多分支语句

elif表示否则如果
编辑shell如下
#!/bin/bash
read -p '输入分数:' a
if [ $a = 100 ]
   then echo 满分
elif [ $a -le 99 ]&&[ $a -ge 80 ]
   then echo 优秀
elif [ $a -le 79 ]&&[ $a -ge 60 ]
   then echo 及格
elif [ $a -le 59 ]&&[ $a -ge 0 ]
   then echo 不及格
   else echo 输入错误,请输入0~100数值
fi

4、case格式多分支语句

编辑shell如下,129~131可以表示为129|13[0-1]),字母可以表示为[a-z][A-Z])
#!/bin/bash
read -p '输入分数:' a
case $a in
100)
   echo 满分
;;
[8-9][0-9])
   echo 优秀
   ;;
[6-7][0-9])
   echo 合格
;;
[0-5][0-9])
   echo 不合格
;;
0)
   echo 不合格
;;
*)
   echo 请输入0~100
;;
esac

结语

     一个合格的shell脚本应该遵循标准的脚本结构,能够给出友好的提示信息,更加容易读懂,对于代码较多、结构复杂的脚本,应该添加必要的注释文字

版权声明:本文为CSDN博主「1风天云月」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/le616616/article/details/122908704

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值