Linux笔记-3

news2024/11/18 9:45:30

软件安装

概述

  1. 在Linux中,软件安装分为3种方式:绿色安装(压缩包解压之后就能直接使用),rpm安装(类似于Windows中的exe或者msi文件),yum安装

  2. RPM(Red Hat Package Manager):红帽提供的软件包的管理工具。可以通过rpm命令来安装软件

    1. rpm包的命名格式:软件名称-版本号-能够运行的平台.rpm

    2. 基本命令

      1. 已经安装了哪些rpm

        rpm -qa
        # -q,query,查询
        # -a,all,所有
        
      2. 确定是否安装了具体的软件,例如MySQL

        rpm -qa | grep -i mysql
        
      3. 卸载软件

        # 查询这个软件
        rpm -qa | grep -i nmap
        # 卸载软件
        # -e,establish,卸载
        # -v,verbose,详细信息
        # --nodeps,忽略依赖
        rpm -ev --nodeps nmap-ncat-6.40-16.el7.x86_64
        
      4. 安装rpm包

        # -i,install,安装
        # -v,verbose,详细过程
        # -h,hash,校验哈希码
        rpm -ivh nc-1.84-22.el6.x86_64.rpm
        

YUM

  1. YUM(yellow dog updater Modifier):Red Hat提供的一款软件管理工具,基于rpm来进行的安装

  2. 在进行rpm安装的时候,有时候会碰到非常多的依赖,所以红帽公司就提供了YUM用于解决依赖问题。在进行yum安装的时候,自动将需要的依赖按照规定顺序来下载和安装

  3. 基本命令

    1. 查看已经安装所有的软件

      # -y,yes,确认
      yum -y list
      
    2. 查看是否已经安装了具体的软件

      yum -y list | grep -i mysql
      
    3. 卸载软件

      yum -y remove firefox
      
    4. 安装软件

      yum -y install firefox
      
    5. 清理缓存

      yum -y clean
      
  4. yum源:默认情况下,YUM源是国外Apache的源,也因此下载效率相对较低。当国外源无法连接的时候,自动的切换到国内的yum源。本机yum源由/etc/yum.repos.d/CentOS-Base.repo决定

  5. 实际过程中,一般会将yun源替换为国内的yum源,比较常用的是阿里、华为、网易、腾讯等

补充

上传/下载

  1. 安装工具

    yum -y install lrzsz
    
  2. 下载命令

    sz 文件名
    
  3. 上传

    rz
    

Shell

概述

  1. Shell是一个命令解释器,接收用户/程序的操作/指令,然后将指令解析之后交给操作系统的内核来执行

  2. Shell本身也可以看作是一门编程语言,相对易于书写,灵活性很强

  3. Linux中提供了Shell解析器

    sh是bash的软链接,所以执行sh和使用bash的效果是相同的

  4. Centos中默认使用的是/bin/bash

入门脚本

  1. 默认情况下,脚本是以.sh作为结尾

  2. 规定:所有的Shell脚本的第一行必须是#!/bin/bash,指定这个Shell脚本的解析器

  3. 步骤

    1. 创建空文件

      cd /opt
      mkdir shelldemo
      cd shelldemo
      touch demo.sh
      
    2. 编辑脚本

      vim demo.sh
      
    3. 定义脚本

      #!/bin/bash
      
      echo 'Hello world!
      
    4. 赋权

      chmod u+x demo.sh
      
  4. 执行脚本

    # 方式一:bash/sh 相对路径
    sh demo.sh
    bash demo.sh
    sh ./demo.sh
    bash ./demo.sh
    # 方式二:bash/sh 绝对路径
    sh /opt/shelldemo/demo.sh
    # 方式三:. 相对路径
    . demo.sh
    . ./demo.sh
    
  5. 案例

    1. 定义脚本

      touch demo2.sh
      
    2. 编辑脚本

      vim demo2.sh
      
    3. 添加内容

      #!/bin/bash
      
      a=2
      echo $a
      
    4. 执行脚本

    5. sh和.的区别:

      1. sh在当前系统解析器中开启了一个新的子解析器来执行这个脚本,当脚本执行完成之后,这个子解析器会一起关闭
      2. .表示直接在当前的解析器中解析这个脚本

变量

  1. 定义变量:

    变量名=变量值
    # 注意:在Linux中,空格表示隔断,所以定义变量的时候不要写空格!!!
    a=2
    # a = 2是错误的
    
  2. 如果要引用变量,是通过$变量名来使用

  3. 在Linux中,所有的数据默认都是字符串。如果数据中有空格,那么需要使用单引号或者双引号来标记

    # echo hello world 是错误的
    echo 'hello world'
    echo "hello world"
    
  4. 销毁变量

    # unset 变量名
    unset a
    
  5. 在Linux中,预定义了大量的变量,例如PATHUSER

  6. 只读变量

    readonly 变量名=变量值
    # 定义好只能读不能改,类似于Java中的常量
    # readonly定义的变量不能被销毁
    
  7. export:提升变量,将变量提升为全局变量,在整个系统中可用。一般环境变量都会使用export

  8. 运算

    # 方式一:$[ 运算 ]
    echo $[ 2+3 ]
    # 方式二: $(( 运算 ))
    echo $(( 2+3 ))
    # 案例
    a=4
    b=5
    echo $[ $a+$b ]
    echo $(( $a+$b ))
    
  9. $n:n是一个数字。n=0,表示获取当前脚本文件的名字;n=1~9表示获取第1-9个参数,如果n≥10,表示第10个及以上的参数,此时需要写成${n},例如${10}${11}

    vim vardemo1.sh
    # 在文件中添加
    #!/bin/bash
    
    echo '文件名:'$0
    echo '参数1:'$1
    echo '参数2:'$2
    echo '和:'$[ $1+$2 ]
    # 保存退出,执行脚本
    sh vardemo1.sh 3 6
    
  10. 其他

    vim vardemo2.sh
    # 添加内容
    #!/bin/bash
    
    echo '参数个数:'$#
    echo '所有参数:'$*
    echo '所有参数:'$@
    # 保存退出,执行脚本
    sh vardemo2.sh 2 8 5 8 1 2 5 1 26 748
    

条件判断

  1. 格式

    # 格式一:test 条件
    test 4 -gt 3
    # 格式二:[ 条件 ]
    [ 4 -gt 3 ]
    # []中如果不是条件,那么只要不是空的就成立
    [ fesco ] # 成立
    [ ] # 不成立
    
  2. 如果需要获取判断结果,需要通过$?。如果上一条命令正确执行,那么返回0

  3. 条件符号(数字)

    符号解释
    -gtgreater than,大于
    -gegreater than or equal,大于等于
    -eqequal,等于
    -leless than or equal,小于等于
    -ltless than,小于
    -nenot equal,不等
  4. 如果是字符,可以通过=或者!=来判断

  5. 文件

    # -r 判断文件是否可读
    [ -r demo.sh ]
    # -w 判断文件是否可写
    [ -w demo.sh ]
    # -x 判断文件是否可执行
    [ -x demo.sh ]
    # -f 判断是否是一个文件
    [ -f demo.sh ]
    # -d 判断是否是一个目录
    [ -d demo.sh ]
    # -e 判断文件是否存在
    [ -e demo.sh ]
    

流程控制

if结构

  1. 基本格式

    # 格式一
    if [ 条件 ];then
    	逻辑
    fi
    或者
    if [ 条件 ]
    then
    	逻辑
    fi
    # 格式二
    if [ 条件 ]
    then
    	逻辑1
    else
    	逻辑2
    fi
    # 格式三
    if [ 条件 ]
    then
    	逻辑1
    elif [ 条件 ]
    then
    	逻辑2
    ...
    else
    	逻辑
    fi
    
  2. 案例

    vim ifdemo.sh
    # 添加内容
    #!/bin/bash
    
    if [ $(( $1 % 2)) -eq 1 ]
    then
            echo $1'是一个奇数'
    else
            echo $1'是一个偶数'
    fi
    # 保存退出,执行脚本
    sh ifdemo.sh 5
    

case结构

  1. case结构类似于Java中的switch-case

    case 变量 in 
    "值1")
    	逻辑
    ;;
    "值2")
    	逻辑
    ;;
    ...
    *)
    	逻辑
    ;;
    esac
    
  2. case结构实际过程中经常用于脚本的集群命令

    vim casedemo.sh
    # 在文件中添加
    #!/bin/bash
    
    case $1 in
    "start")
            echo '启动xxx'
    ;;
    "stop")
            echo '停止xxx'
    ;;
    "restart")
            echo '重启xxx'
    ;;
    *)
            echo '未知的操作'
    ;;
    esac
    # 保存退出,执行脚本
    sh casedemo.sh start
    

for结构

  1. 基本结构

    # 方式一
    for (( 初始值;条件;变化 ))
    do
    	逻辑
    done
    # 方式二
    for 变量 in 值1, 值2, 值3, ...
    do
    	逻辑
    done
    
  2. 案例一:求1-100的和

    vim fordemo.sh
    # 在文件中添加
    #!/bin/bash
    
    sum=0
    for (( i=1;i<=100;i++ ))
    do
            sum=$[ $sum+$i ]
    done
    
    echo $sum
    # 保存退出,执行脚本
    sh fordemo.sh
    
  3. 案例二:求输入的所有参数的和

    vim fordemo2.sh
    # 添加
    #!/bin/bash
    
    sum=0
    for i in $*
    do
    	sum=$[ $sum+$i ]
    done
    echo $sum
    # 保存并执行
    sh fordemo2.sh 5 6 4 1 7 9 2
    

while结构

  1. 基本格式

    while [ 条件 ]
    do
    	逻辑
    done
    
  2. 案例:求1-100的和

    vim whiledemo.sh
    # 添加内容
    #!/bin/bash
    
    sum=0
    i=1
    while [ $i -le 100 ]
    do
    	sum=$[ $sum+$i ]
    	i=$[ $i+1 ]
    done
    echo $sum
    # 保存并执行
    sh whiledemo.sh
    

函数

  1. 在Shell中,统一通过function来定义函数

  2. 格式

    function 函数名()
    {
    	逻辑
    	[return 返回值]
    }
    
  3. Shell是一门解释型语言,也就意味着,Shell是逐行解释执行,也就是说,函数必须先定义后使用

  4. 不同于Java的地方在于,Shell中的函数的返回值只能是整数(0~255)。如果不写return语句,那么默认函数的最后一行代码的执行结果就是返回值

  5. 案例:求两个整数的和

    vim functiondemo.sh
    # 添加
    #!/bin/bash
    
    function sum()
    {
    	# 在函数中,$n的形式表示第几个参数
    	sum=$[ $1+$2 ]
    	echo $sum
    }
    
    sum 3 5;
    
  6. 系统自带函数:

    1. basename:截取路径中的文件名
    2. dirname:截取路径中的目录

常用工具

  1. wc:word count的缩写,可以统计文件中字节个数、字符数量、列数等

    # -l,line,行数
    # -w,word,单词数
    # -m,字符数
    # -c,字节数
    wc -l -w -m -c b.cfg
    
  2. cut:针对数据进行处理,可以从一行数据中剪切出指定的部分

    # -d,descriptor,间隔符号,默认是制表符
    # -f,剪切之后要获取第几列
    echo $PATH | cut -d ':' -f 4
    echo $PATH | cut -d ':' -f 3-5
    
  3. sed:是一个流式编辑器,一次处理一行内容,可以对文件进行复杂的操作

    1. 命令格式

      sed [参数] command 文件
      
    2. 追加操作

      # a:在指定行之后追加
      # 在a.txt第二行后追加一行hello
      sed '2ahello' a.txt
      # 在指定内容之后追加一行hi
      sed '/tom/ahi' a.txt
      # i-在指定行之前追加一行
      # 在第4行之前追加一行big
      sed '4ibig' a.txt
      # 在指定数据之前追加一行big
      sed '/bruce/ibig' a.txt
      # 在最后一行追加
      sed '$abig' a.txt
      
    3. 修改/替换操作

      # c:修改指定的内容
      # 将第三行修改为aaa
      sed '3caaa' a.txt
      

将b开头的行修改为alex

  sed '/^b/calex' a.txt
  # 将最后一行替换为hello
  sed '$chello' a.txt
  ```
  1. 删除操作

    # d:删除
    # 删除第四行
    sed '4d' a.txt
    # 删除最后一行
    sed '$d' a.txt
    # 删除第3~5行
    sed '3,5d' a.txt
    # 删除奇数行 n~md从第n行开始,每m行删除一次
    sed '1~2d' a.txt
    # 删除除了3~5行以外的其他行
    sed '3,5!d' a.txt
    # 删除包含指定内容的行,例如删除包含m的行
    sed '/m/d' a.txt
    # 从找到含有y的行开始,删除到最后
    sed '/y/,$d' a.txt
    # 从找到含有y的行开始,继续往下删除2行
    sed '/y/,+2d' a.txt
    # 删除含有m或者含有y的行
    sed '/m\|y/d' a.txt
    # 删除第3行~第7行之间含有m的行
    sed '3,7{/m/d}' a.txt
    # 删除空行
    sed '/^$/d' a.txt
    
  2. 替换操作

    # s:替换数据,而不是整行
    # 将m替换为a
    sed 's/m/a/' a.txt
    # 等价于 -- g代表全部
    sed 's/m/a/g' a.txt
    # i-忽略大小写
    sed 's/m/a/i' a.txt
    # w-保存,将产生了修改的数据放到指定的文件中
    sed 's/m/a/w c.txt' a.txt
    # -n表示保留被操作过的数据
    # p表示打印匹配的内容
    sed -n 's/m/a/p' a.txt
    
  3. 打印操作

    # p:打印匹配的内容,一般结合-n使用
    # 打印文件的所有行
    sed -n 'p' a.txt
    # 只显示第5行
    sed -n '5p' a.txt
    # 每隔2行打印一次
    sed -n '1~3p' a.txt
    # 打印1~3行
    sed -n '1,3p' a.txt
    # 打印最后一行
    sed -n '$p' a.txt
    
  4. 读取操作

    # r-从一个文件中读取写入另一个文件
    # 从a.txt的第5行开始插入c.txt的内容,然后继续读取a.txt
    sed '5r c.txt' a.txt
    # 从b开头的行开始,插入c.txt的内容
    sed '/^b/r c.txt' a.txt
    # 需要在a.txt的最后一行插入
    sed '$r c.txt' a.txt
    
  5. 写入操作

    # w-写入另一个文件
    # 将a.txt的数据覆盖到c.txt中
    sed 'w c.txt' a.txt
    # 将a.txt的第2行数据覆盖到c.txt中
    sed '2w c.txt' a.txt
    # 将a.txt的含有m的数据覆盖到c.txt中
    sed '/m/w c.txt' a.txt
    
  6. awk:对数据进行逐行处理,可以对数据进行切分

    # -F 指定间隔符
    # 搜索passwd文件中,以root开头的所有的行,并且打印该行的第3个字段
    awk -F: '/^root/{print $3}' /etc/passwd
    # 第三列和第五列
    awk -F: '/^root/{print $3,$5}' /etc/passwd
    # 获取第一列(用户)和第六列(数据目录列),并且在第一行打印"user,data_home",在末尾打印一个"end"
    awk -F: 'BEGIN{print "user,data_home"} {print $1,$6} END{print "end"}' /etc/passwd
    # awk中内置了其他命令:FILENAME-文件名,NR-已读取的行数,NF-切分完之后产生了多少列
    awk -F: '{print "filename:"FILENAME",line:"NR",columns:"NF}' /etc/passwd
    # 查询文件中空行对应的行号
    awk '/^$/{print NR}' a.txt
    
  7. sort:对文件中的数据排序,默认是按照字典序

    # -n:按照大小排序
    sort -n a.txt
    # -r:逆序排序
    sort -r a.txt
    # -k:指定排序列
    # -u:不重复,unique
    

t
```

  1. awk:对数据进行逐行处理,可以对数据进行切分

    # -F 指定间隔符
    # 搜索passwd文件中,以root开头的所有的行,并且打印该行的第3个字段
    awk -F: '/^root/{print $3}' /etc/passwd
    # 第三列和第五列
    awk -F: '/^root/{print $3,$5}' /etc/passwd
    # 获取第一列(用户)和第六列(数据目录列),并且在第一行打印"user,data_home",在末尾打印一个"end"
    awk -F: 'BEGIN{print "user,data_home"} {print $1,$6} END{print "end"}' /etc/passwd
    # awk中内置了其他命令:FILENAME-文件名,NR-已读取的行数,NF-切分完之后产生了多少列
    awk -F: '{print "filename:"FILENAME",line:"NR",columns:"NF}' /etc/passwd
    # 查询文件中空行对应的行号
    awk '/^$/{print NR}' a.txt
    
  2. sort:对文件中的数据排序,默认是按照字典序

    # -n:按照大小排序
    sort -n a.txt
    # -r:逆序排序
    sort -r a.txt
    # -k:指定排序列
    # -u:不重复,unique
    

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

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

相关文章

世界的本质是旋转(5)-在复平面上驱动软件无线电SDR交换BPSK波形

在上一篇文章中&#xff0c;我们介绍了复平面、拍照采样的一些思维实验。从本节开始&#xff0c;转入现实应用&#xff0c;通过控制复平面向量的位置&#xff0c;实现一个完整的BPSK全双工通信通道。 发射方&#xff1a;通过控制复平面向量在各个时刻的位置来携带信息的技术&a…

LeetCode234题:回文链表(python3)

代码思路&#xff1a;将链表的值复制到数组列表中&#xff0c;再使用双指针法判断&#xff0c;不断更新current_node的值。 # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next…

水泵远程自动控制系统

随着科技的不断进步和工业的快速发展&#xff0c;传统的水泵管理方式已经无法满足现代水利系统的需求。为了应对这一挑战&#xff0c;HiWoo Cloud水泵远程自动控制系统&#xff0c;旨在通过智能化、网络化的技术手段&#xff0c;实现对水泵的远程监控、自动调节和智能管理&…

可让照片人物“开口说话”阿里图生视频模型EMO,高启强普法

3 月 1 日消息&#xff0c;阿里巴巴研究团队近日发布了一款名为“EMO&#xff08;Emote Portrait Alive&#xff09;”的 AI 框架&#xff0c;该框架号称可以用于“对口型”&#xff0c;只需要输入人物照片及音频&#xff0c;模型就能够让照片中的人物开口说出相关音频&#xf…

海外代购系统独立站,商品采集API接口系列

海外代购系统独立站是一个完整的电商平台&#xff0c;专为代购业务设计。这样的系统通常具备商品采集、库存管理、订单处理、支付集成、物流追踪等功能。其中&#xff0c;商品采集是整个系统的基础&#xff0c;而API接口是实现商品采集的关键。 请求示例&#xff0c;API接口接…

3 月 4 日-5 月 3 日|2024 乐鑫全球开发者大会演讲征集中!

乐鑫信息科技 (688018.SH) 全球开发者大会作为一年一度的技术盛宴&#xff0c;旨在为全球开发者们提供一个交流、分享、学习的平台。在这里&#xff0c;您可以与来自世界各地的同行们在线交流&#xff0c;共同探讨技术的最新动态和发展趋势。 30 场技术演讲每年 前沿创新、物…

企业必备监管工具:让管理更简单,效率倍增!

微信作为当前广泛使用的沟通工具&#xff0c;成为企业监管的重要对象。因此&#xff0c;使用微信管理系统成为企业必备的监管工具之一。下面就给大家分享微信管理系统的监管功能&#xff0c;让大家的管理更简单、更高效&#xff01; 1、敏感词监控 设置完成后&#xff0c;一旦…

leetcode日记(36)全排列

想思路想了很久……思路对了应该会很好做。 我的思路是这样的&#xff1a;只变化前n个数字&#xff0c;不断增加n&#xff0c;由2到nums.size()&#xff0c;使用递归直到得到所有结果 代码如下&#xff1a; class Solution { public:vector<vector<int>> permut…

【Python】变量的引用

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

光纤激光打标机如何在不锈钢产品上镭雕出白色效果

光纤激光打标机在不锈钢产品上镭雕出白色效果的关键在于对激光打标参数的精确控制。这涉及到激光的功率大小、打标速度、点与点之间的间距以及激光的频率等多个方面。 在镭雕过程中&#xff0c;激光能量与不锈钢表面发生相互作用&#xff0c;产生热效应和化学效应。通过调整激光…

什么是同源策略?如何检测跨站点 WebSocket 劫持漏洞?post 表单跳转跨域问题、Ajax跨域请求、浏览器特性和安全策略、WebSocket 协议连接

什么是同源策略?如何检测跨站点 WebSocket 劫持漏洞?post 表单跳转跨域问题、Ajax跨域请求、浏览器特性和安全策略、WebSocket 协议连接。 同源策略(Same Origin Policy)是一种浏览器安全机制,用于保护用户的信息和数据安全。它限制了来自不同源(协议、域名、端口)的网页…

c语言游戏实战(10):坤坤的篮球回避秀

前言&#xff1a; 这款简易版的球球大作战是博主耗时两天半完成的&#xff0c;玩家需要控制坤坤在游戏界面上移动&#xff0c;来躲避游戏界面上方不断掉下来的篮球。本游戏使用C语言和easyx图形库编写&#xff0c;旨在帮助初学者了解游戏开发的基本概念和技巧。 在开始编写代…

灾备建设中异地副本含义及使用

异地副本是指将备份数据存放在不同的地理位置&#xff0c;确保数据的安全性和可用性。这种备份方法可以降低数据丢失的风险&#xff0c;因为即使一个位置出现机房级灾难&#xff0c;导致数据出现故障&#xff0c;也可以从另一个位置的数据副本中恢复使用。 在进行异地副本备份…

LeetCode每日一题【c++版】- leetcode 2369. 检查数组是否存在有效划分【动态规划】

题目描述 题目链接&#xff1a;2369.检查数组是否存在有效划分 描述&#xff1a; 给你一个下标从 0 开始的整数数组 nums&#xff0c;你必须将数组划分为一个或多个连续子数组。如果获得的这些子数组中每个都能满足下述条件 之一 &#xff0c;则可以称其为数组的一种有效划分…

JVM常用排查命令

top命令 top命令是我们最常用的Linux命令之一&#xff0c;它可以实时的显示当前正在执行的进程的CPU使用率&#xff0c;内存使用率等系统信息。top -Hp pid 可以查看线程的系统资源使用情况。 vmstat命令 vmstat是一个指定周期和采集次数的虚拟内存检测工具&#xff0c;可以…

Android 拍照本地图片选择框架适配

前言 通常技术方案的选择、会带来后续一些不可控的东西&#xff0c;这也是没法避免的&#xff0c;程序开发者中同时面对、测试、领导、产品各种要求。同时在网络上查找的资料也只是很旧的&#xff0c;不一定适合新设备&#xff0c;需要推倒重新弄 1、解决方案通过意图选择器做…

如何关闭谷歌浏览器“提示密码泄露”的弹窗

使用谷歌浏览器的时候&#xff0c;经常看见图中的提示&#xff0c;大致意思是&#xff1a; 你的密码被外泄&#xff0c;建议你立即检查和修改密码。 只要你不修改密码&#xff0c;这个弹窗就会不停地弹出来提示你。 那么怎么关闭这个弹窗呢&#xff1f; 第一个方法很简单&am…

情感分析(文本分类)数据集汇总

想在推荐前对评论做一些情感分析方面的工作,参考网上其它博主的博客大概整理了一下情感分析方面的数据集的内容&#xff0c;大致分为两类——多分类和二分类&#xff08;俺比较关注的&#xff09;&#xff0c;中英文的数据集都汇总整理了一下&#xff0c;后面会关注一下相关的比…

processing绘制笑脸

笑脸效果图&#xff1a; processing代码&#xff1a; void setup(){size(1000,1000);//Canvas sizebackground(#ffcc33);//Canvas background color } void draw(){ strokeWeight(12);//face-width12px fill(#ffffcc);//face arc(500,500,200,200,0,TWO_PI);//face-size strok…

智慧公厕:打造智慧城市的环卫明珠

在城市建设中&#xff0c;公共卫生设施的完善和智能化一直是重要环节。而智慧公厕作为智慧城市建设的重要组成部分&#xff0c;发挥着不可替代的作用。本文以智慧公厕源头实力厂家广州中期科技有限公司&#xff0c;大量精品案例现场实景实图&#xff0c;解读智慧公厕如何助力打…