【无标题】shell脚本的基本命令+编写shell脚本

news2024/11/19 10:26:53

shell脚本

一.shell基础

1.shell概念

2.shell脚本

3.shell脚本编写注意事项

二.编写shell脚本

1.编写一个helloworld脚本,运行脚本

[root@shell ~]# vim helloworld.sh
#!/bin/bash  //声明
echo "hello world!"
ls -lh /etc/
运行脚本(四种方式):
[root@shell ~]# bash helloworld.sh
[root@shell ~]# sh helloworld.sh
[root@shell ~]# source helloworld.sh
[root@shell ~]# chmod +x helloworld.sh 
[root@shell ~]# ./helloworld.sh
​

2.编写一个nginx安装脚本

[root@shell ~]# mkdir /root/shell
[root@shell ~]# vim /root/shell/install_nginx.sh
#!/bin/bash
yum -y install gcc gcc-c++ make pcre-devel oprnssl-devel wget
cd /usr/local/scr/
wget 'https://nginx.org/download/nginx-1.26.1.tar.gz'
tar xf nginx-1.26.1.tar.gz
cd nginx-1.26.1
./configure --prefix=/usr/local/nginx
make -j 4
make install
[root@shell shell]# cd /root/shell
[root@shell shell]# sh install_nginx.sh
​

三.变量

1.自定义变量

[root@shell shell]# set a=3
[root@shell shell]# echo a
a
[root@shell shell]# unset a
[root@shell shell]# echo a
a
[root@shell shell]# echo $a
​

2.环境变量

由系统维护,用于设置工作环境

脚本或者应用需要参数的时候使用

$PWD

$SHELL

$USER

[root@shell shell]# vim test1.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo $4
echo $5
[root@shell shell]# bash test1.sh 1 2 3 4 5
1
2
3
4
5
​
​
[root@shell shell]# bash test1.sh t j j f b
t
j
j
f
b
​

3.位置变量

[root@shell ~]# vim creat.sh
#!/bin/bash
useradd $1
echo $2|passwd --stdin $1
[root@shell ~]# sh creat.sh

4.预定义变量

[root@shell ~]# vim ss.sh
#!/bin/bash
#将所有的脚本参数输出
for x in "$*"
do
  echo $x
done
[root@shell ~]# sh ss.sh a b c
a b c
[root@shell ~]# sh ss.sh g q i g d
g q i g d
将*改为@运行
[root@shell ~]# sh ss.sh g q i g d
g
q
i
g
d
​

四.判断语法

shell的返回值:运行一条命令,都会有一个返回值,0表示执行正常,非0表示执行异常。

[root@shell ~]# test 3 -gt 2
[root@shell ~]# echo $?
0

1.条件判断---if语句

[root@shell ~]# vim if.sh
#!/bin/bash
echo "1:"
read a
echo "2:"
read b
if [ $a -eq $b ]; then
        echo "相等"
else
       echo "不相等"
fi
[root@shell ~]# sh if.sh
1:
3
2:
5
不相等
​

2.创建检测脚本,检测网络是否流畅

[root@shell ~]# vim web.sh
#!/bin/bash
read -p "输入网址:" web  //read:命令行输入web的值
ping -c 3 $web &> /dev/null  //连接某个网站三次
if [ $? -eq 0 ]; then   //如果ping命令执行成功
     echo "网络畅通"
else
     echo "网络异常"
fi
root@shell ~]# sh web.sh
输入网址:www.baidu.com
网络畅通
​

五.字符串判断格式:

1.字符串的比较

[root@shell ~]# aaa="abc"
[root@shell ~]# echo $aaa
abc
[root@shell ~]# test $aaa == "abc"
[root@shell ~]# echo $?
0
[root@shell ~]# test $aaa == "dggn"
[root@shell ~]# echo $?
1
[root@shell ~]# unset aaa
[root@shell ~]# echo $aaa
​
​
​

2.案例

(1)创建简单的字符串判断脚本

[root@shell ~]# vim zfc.sh
#!/bin/bash
read -p "请输入账号" user
echo $user
if [ $user == "admin" ]; then
     echo "欢迎登录:$user"
else
    echo "账号或密码错误"
fi
[root@shell ~]# sh zfc.sh
请输入账号admin
admin
欢迎登录:admin
[root@shell ~]# sh zfc.sh
请输入账号egu
egu
账号或密码错误
​

(2)创建rpm查询软件是否安装

[root@shell ~]# vim rpm.sh
#!/bin/bash
rpm -qa|grep nginx
#echo $?
yum -y install epel.release
if [ $? -eq 1 ];then
      yum -y install nginx
else
      yum -y remove nginx
      yum -y install nginx
fi
[root@shell ~]# sh rpm.sh
        

六.文件,目录,权限的判断

1.格式:

2.常用操作符:

[root@shell ~]# touch abc
[root@shell ~]# ls -lh abc
-rw-r--r--. 1 root root 0 7月  26 11:26 abc
[root@shell ~]# [ -e "abc" ]
[root@shell ~]# echo $?
0
[root@shell ~]# [ -e "ewf" ]
[root@shell ~]# echo $?
1
[root@shell ~]# [ -e "aaaaaa" ]
[root@shell ~]# echo $?
1
[root@shell ~]# [ -w "aaaaaa" ]
[root@shell ~]# echo $?
1
[root@shell ~]# [ -x "abc" ]
[root@shell ~]# echo $?
1
[root@shell ~]# chmod +x abc
[root@shell ~]# [ -x "abc" ]
[root@shell ~]# echo $?
0
[root@shell ~]# ls -l abc
-rwxr-xr-x. 1 root root 0 7月  26 11:26 abc
​

3.案例

nginx安装脚本优化,判断是否已经安装nginx

七.与或判断

判断多个条件

多个条件其中一个成立,或

多个条件都要成立,与

或运算判断:||

与运算判断:&&

1.或运算

[root@shell ~]# vim huo.sh
#!/bin/bash
read -p "请输入名称" name
if [ $name == "haha" ]||[ $name == "xixi" ];then
    echo "成立"
else
    echo "不成立"
fi
[root@shell ~]# sh huo.sh
请输入名称haha
成立
​

2.与运算

[root@shell ~]# vim yu.sh
#!/bin/bish
read -p "请输入年龄" age
read -p "请输入性别" gender
if [ $age -ge 30 ] && [ $gender == "女" ];then
    echo "涨工资"
else
    echo"不加"
fi
[root@shell ~]# sh yu.sh
请输入年龄34
请输入性别女
涨工资
​

3.多层判断

[root@shell ~]# vim dc.sh
#!/bin/bash
echo "1新增文件 2删除文件 3修改文件 4查找文件"
read -p "请选择序号" m
if [ $m == 1 ];then
     touch aaaaa.txt
elif [ $m == 2 ]; then
     rm -fr aaaaa.txt
else
     echo "其他功能正在开发"
fi
[root@shell ~]# sh dc.sh
​

八.shell读取用户输入

1.read

格式:read -选项

[root@shell ~]# read -p "请输入" -s s
请输入[root@shell ~]# echo $s
aadswdqdweqhjhbnhbuuiwefggywgywygfe
[root@shell ~]# read -p "请输入" s
请输入dtdyuj
[root@shell ~]# echo $s
dtdyuj
[root@shell ~]# read -p "三个变量" a b c
三个变量12 13 14
[root@shell ~]# echo $a
12
[root@shell ~]# echo $b
13
[root@shell ~]# echo $c
14
[rot@shell ~]# vim pas.sh
#!/bin/bash
read -p "username:" username
read -p "password:" -s password
useradd $useranme
echo $password|passwd --stdin $username
if [ $? -eq 0 ]; then
     echo "账户$username注册成功"
fi
​

九.循环语法

1.for循环

[root@shell ~]# vim int.sh
#!/bin/bash
for x in $*
do
   echo $x
done
[root@shell ~]# sh int.sh 我 是 秦始皇
我
是
秦始皇
[root@shell ~]# vim int.sh
#!/bin/bash
for city in 青岛 北京 天津
do
   echo "$city是个好地方"
done
[root@shell ~]# sh city.sh
青岛是个好地方
北京是个好地方
天津是个好地方
​
​

在命令结果中循环

在命令结果中循环:
[root@shell ~]# vim 1.sh
#!/bin/bash
for u in $(awk -F':' '{print $1}' /etc/passwd)
do   
     echo "$u"
done
[root@shell ~]# sh 1.sh

检查某个网段的存活主机

[root@shell ~]# vim ping.sh
#!/bin/bash
for IP in $(echo 12.168.2.{1..150})
do
  ping -c 2 -i 0.1 $IP &> /dev/null
if [ $? -eq 0 ]; then
    echo "$IPisup "
fi
done
[root@shell ~]# bash ping.sh
​

2.while循环

3.循环的break和continue

break ---直接退出

continue---退出当前循环,进入下次循环

九九乘法表

[root@shell ~]# vim jj.sh
#!/bin/bash
for i in {1..9};do
for j in {1..9};do
echo -n "$j*$i=$(($i*$j)) "
if [ $j == $i ];then
echo -e '\n'
break
fi
done
done
[root@shell ~]# bash jj.sh
1*1=1 
​
1*2=2 2*2=4 
​
1*3=3 2*3=6 3*3=9 
​
1*4=4 2*4=8 3*4=12 4*4=16 
​
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 
​
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 
​
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 
​
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 
​
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81 

十.sed

sed是文本处理工具,用来读取文件内容

格式:sed '过滤+动作' 文件路径

sed选项:

[root@shell ~]# rm -rf *
[root@shell ~]# cp /etc/sysconfig/network-scripts/ifcfg-ens33 ./
[root@shell ~]# sed -n '2p' ifcfg-ens33 //打印第二行
PROXY_METHOD=none
[root@shell ~]# sed -n '1,3p' ifcfg-ens33  //打印1到3行
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
[root@shell ~]# sed -n '1p;3p' ifcfg-ens33 //打印1,3行 
TYPE=Ethernet
BROWSER_ONLY=no
​

配置一个自动设置静态ip以及关闭selinux服务,关闭NetWorkManager,修改主机名脚本,ip和主机名使用read输入,这个操作只能在root下执行

[root@shell ~]# vim zd.sh
#!/bin/bash
#备份
cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33.bak
read -p "请输入ip地址:" ip
sed -i '/dhcp/s/dhcp/none/g' /etc/sysconfig/network-scripts/ifcfg-ens33
sed -i '$aIPADDR='"$ip"'' /etc/sysconfig/network-scripts/ifcfg-ens33
sed -i '$aNETMASK=255.255.255.0' /etc/sysconfig/network-scripts/ifcfg-ens33
sed -i '$aGATEWAY=192.168.2.1' /etc/sysconfig/network-scripts/ifcfg-ens33
sed -i '$aDNS1=8.8.8.8' /etc/sysconfig/network-scripts/ifcfg-ens33
sed -i '$aDNS2=114.114.114.114' /etc/sysconfig/network-scripts/ifcfg-ens33
sed -i '/UUID/cUUID='"$(uuidgen)"'' /etc/sysconfig/network-scripts/ifcfg-ens33

#修改主机名
read -p "请输入主机名称:" hn
hostnamectl set-hostname $hn

#停用selinux
setenforce 0
sed -i '/SELINUX/cSELINUX=disabled' set /etc/selinux/config

#停用防火墙
systemctl stop firewalld
systemctl disable firewalld

#停用NetworkManager
systemctl stop NetworkManager
systemctl disable NetworkManager

[root@shell ~]# bash zd.sh
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1955225.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

react版本判断是否面包含

react-admin: react版本 import { useState,useEffect } from react import ./Secene.css import { Checkbox } from "antd"; import* as turf from turf/turf; import type { CheckboxProps } from antd; // const onChange: CheckboxProps[onChange] (e) >…

bugku-web-cookies

进来以后看到一个巨长的字符串, 源码同样,发现url后面是base64编码解码得keys.txt 还有一个line参数,修改并没有发生任何变化。我想不到要改keys.txt成index.php(base64加密格式:aW5kZXgucGhw) line1时: line2时&…

Linux系统编程(2):信号

Linux内核提供了各种各样的内核对象用于协调进程间的通讯,如信号、管道、消息队列等, 本章针对Linux内核的信号对象进行讲解。 1. 信号的基本概念 1.1. 概述 信号(signal),又称为软中断信号,用于通知进程…

Go语言垃圾回收GC(完整)

垃圾回收的概念 GC(垃圾回收)是 Go 语言中的一个重要机制,用于自动管理内存 在 Go 语言中,GC 会自动发现和回收那些不再被使用的内存空间,从而防止内存泄漏和有 效利用内存。 内存垃圾怎样产生 程序在内存上被分为堆区、栈区、全局数据区、…

黑马头条vue2.0项目实战(一)——项目初始化

1. 图标素材(iconfont简介) 制作字体图标的工具有很多,推荐使用:iconfont-阿里巴巴矢量图标库。 注册账户 创建项目 可以根据项目自定义 class 前缀 上传图标到项目 生成链接,复制 css 代码,在项目中使用…

数组与链表谁访问更快

一、线性表 线性表是数据结构中的一种基本类型,它由一组线性排列的元素组成。线性表的特点是可以进行顺序访问,但不支持随机访问。 二、非线性表 非线性表是数据结构中另一种类型,如树和图,它们由多个节点组成,节点…

【云原生】Docker搭建知识库文档协作平台Confluence

目录 一、前言 二、企业级知识库文档工具部署形式 2.1 开源工具平台 2.1.1 开源工具优点 2.1.2 开源工具缺点 2.2 私有化部署 2.3 混合部署 三、如何选择合适的知识库平台工具 3.1 明确目标和需求 3.2 选择合适的知识库平台工具 四、Confluence介绍 4.2 confluence特…

链表篇: 01-从尾到头打印链表

解题思路: 直接往数组中加入数据,然后通过Java提供的工具类(coollections) 直接进行数组的反转。 代码实现: import java.util.*; /** * //ListNode 的数据结构 * * public class ListNode { * int val; * ListNode next null; * * …

韩顺平0基础学java——第39天

p820-841 jdbc和连接池 1.JDBC为访问不同的数据库提供了统一的接口,为使用者屏蔽了细节问题。 2.Java程序员使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作。 3.jdbc原理图 JDBC带来的好处 2.JDBC带来的…

10 Vue 特性要点

Vue2 特性要点 Vue2 源码理解 Vue 双向数据绑定 先从单向绑定切入单向绑定非常简单,就是把Mode1绑定到view,当我们用Javascript代码更新Model时, view就会自动更新 双向绑定就很容易联想到了,在单向绑定的基础上,用户更新了View, Mode1的数据也自动被更新了 因为 Vue 是数据双向…

手把手教你集成GraphRag.Net:打造智能图谱搜索系统

在人工智能和大数据发展的背景下,我们常常需要在项目中实现知识图谱的应用,以便快速、准确地检索和使用信息。 今天,我将向大家详细介绍如何在一个新的.NET项目中集成GraphRag.Net,这是一个参考GraphRag实现的.NET版本&#xff0c…

Flutter——全网最精致木鱼APP可上架应用市场

研发背景 工作之余,闲来无事,想着研发一款用户可能会经常用到的一款APP,并且能够顺便掌握一下Flutter Material Design 3 UI,所以就有了这款比较精致的木鱼APP的诞生。 开源代码 https://github.com/z244370114/woodenfish

YOLOV8源码解读-C2f模块-以及总结c2模块、Bottleneck

c2f模块是对c2模块的改进 c2模块图解解读 先给出YOLOV8中卷积的定义模块一键三连-卷积-BN-激活函数 def autopad(k, pNone, d1): # kernel, padding, dilation"""Pad to same shape outputs."""if d > 1:k d * (k - 1) 1 if isinstance…

linux练习2

一、搭建nfs服务器,客户端可从服务端/share目录上传与下载文件 **服务端** 1、下载相关安装包 [rootserver ~]# yum install rpcbind -y [rootserver ~]# yum install nfs-utils -y 2、 创建共享文件夹/share并授予权限 [rootserver ~]# mkdir /share [rootserv…

结构体笔记

结构体 C语言中的数据类型: 基本数据类型:char/int/short/double/float/long 构造数据类型:数组,指针,结构体,共用体,枚举 概念: 结构体是用户自定义的一种数据类型&#xff0c…

【七】Hadoop3.3.4基于ubuntu24的分布式集群安装

文章目录 1. 下载和准备工作1.1 安装包下载1.2 前提条件 2. 安装过程STEP 1: 解压并配置Hadoop选择环境变量添加位置的原则检查环境变量是否生效 STEP 2: 配置Hadoop2.1. 修改core-site.xml2.2. 修改hdfs-site.xml2.3. 修改mapred-site.xml2.4. 修改yarn-site.xml2.5. 修改hado…

全球相机控制面板市场展望与未来增长机遇:预计未来六年年复合增长率CAGR为4.3%

在全球摄影器材和专业影像设备需求增长的背景下,相机控制面板正成为市场的焦点。本文详细分析了全球相机控制面板市场的现状、增长趋势及未来前景,旨在为投资者和业内人士提供深入的市场洞察和指导。 市场概览 据恒州诚思团队研究分析显示,2…

Linux内核 mmap内存映射的实现原理

在Linux内核以及Linux系统编程的时候,经常会碰到mmap内存映射,mmap函数是实现高性能编程的一个关键点。本文详细介绍一下mmap实现原理。 虚拟地址映射物理地址 虚拟地址映射物理地址采用的是页表机制,64位CPU采用的是4级页表。 64位CPU虚拟…