SHELL编程-Linux自动化运维基础(变量与条件控制语法)

SHELL编程-Linux自动化运维基础

变量使用

定义与使用

r123@localhost:~$ first_var=aaa
r123@localhost:~$ echo $first_var
aaa
r123@localhost:~$ second_var=123
r123@localhost:~$ echo $second_var
123
r123@localhost:~$ third="bbb ccc"
r123@localhost:~$ echo $third
bbb ccc
  • 定义变量时,变量名不能以数字开头,等号两侧不能出现空格,有空格的变量内容,必须以引号包含
  • 使用变量时必须加上$

拼接变量

r123@localhost:~$ first_var=123
r123@localhost:~$ first_var=${first_var}456
r123@localhost:~$ echo $first_var
123456
r123@localhost:~$ first_var="$first_var"789
r123@localhost:~$ echo $first_var
123456789

查看变量

直接使用set命令将输出目前shell中存在的变量,包括环境变量,我这里以grep筛选出来自定义变量(通常情况下没有办法选出所有自定义变量)

r123@localhost:~$ set | grep first_var
first_var=123456789

取消变量

r123@localhost:~$ unset first_var
r123@localhost:~$ echo $first_var

交互变量

#! /bin/bashread -p "Input a ipaddress: " ip_addressping -c 1 ${ip_address} &> /dev/null && echo "${ip_address} Up" || echo "${ip_address} Down"echo success

三种变量引用

  • ""表示对内部内容进行弱引用,只对空格等字符进行转义,$等不受影响
  • ''表示对内部内容进行强引用,对$等也进行转义
  • ``表示更高的执行优先级
r123@localhost:~$ first_var=123
r123@localhost:~$ echo "$first_var"456
123456
r123@localhost:~$ first_var=123
r123@localhost:~$ echo '$first_var'456
$first_var456
r123@localhost:~$ echo `ls`456
MyMainClass.java content.txt456

变量运算

  • 整数运算
r123@localhost:~$ expr 1 + 1
2
r123@localhost:~$ var_1=123
r123@localhost:~$ var_2=123
r123@localhost:~$ expr $var_1 + $var_2
246

使用expr时,作为运算两个值或变量必须与运算符有空格隔开,还有以下三种方式进行运算

r123@localhost:~$ echo $(($var_1 + $var_2))
246
r123@localhost:~$ echo $((2 ** 2))
4
r123@localhost:~$ echo $[1+2]
3
r123@localhost:~$ let sum=$var_1+$var_2
r123@localhost:~$ echo $sum
246
r123@localhost:~$ let sum++; echo $sum
247
  • 浮点运算

一般浮点运算需要借助bc计算器程序

r123@localhost:~$ sudo apt install bc
r123@localhost:~$ echo "2^4" | bc
16
r123@localhost:~$ echo "scale=3; 2/4" | bc
.500
r123@localhost:~$ echo "scale=3; 5/4" | bc
1.250
r123@localhost:~$ echo "scale=2; 5/4" | bc
1.25

变量类型

环境变量

环境变量是操作系统中的一种配置参数,用于存储系统和应用程序的配置信息。它们是在操作系统运行时由操作系统或用户设置的键值对。这些键值对包含了一些重要的信息,例如系统路径、临时文件夹位置、语言设置等。在计算机程序中,环境变量通常用于指定应用程序的运行时行为,例如定义特定的路径、设置默认值或启用某些功能。程序可以在运行时读取这些环境变量的值,以便适应不同的运行环境或用户需求

通常我们使用export设置临时环境变量用来达到跨shell使用目的,即在当前shell中开启一个子shell后,可以在子shell中使用该变量,我们可以使用pstree来展示shell的层级关系,使用exit来退出当前shell

r123@localhost:~$ export Base_var=233
r123@localhost:~$ ps | grep bash40 pts/0    00:00:00 bash
r123@localhost:~$ bash
r123@localhost:~$ bash
r123@localhost:~$ bash
r123@localhost:~$ ps | grep bash40 pts/0    00:00:00 bash60 pts/0    00:00:00 bash67 pts/0    00:00:00 bash73 pts/0    00:00:00 bash
r123@localhost:~$ pstree
init─┬─init───init───bash───bash───bash───bash───pstree└─{init}
r123@localhost:~$ exit
exit
r123@localhost:~$ pstree
init─┬─init───init───bash───bash───bash───pstree└─{init}
r123@localhost:~$ echo $Base_var
233

如果想要设置的变量永久可用,可以添加到环境变量文件,以下是常见表格:

文件加载时机说明
/etc/environment系统启动时全局环境变量,对所有用户生效
/etc/profile用户登录时全局配置文件,对所有用户生效
/etc/bash.bashrc用户登录时(bash shell)全局bash配置文件,对所有用户生效
~/.bashrc用户登录时(bash shell)用户级别的bash配置文件,只对当前用户生效
~/.bash_profile用户登录时(bash shell)用户级别的bash配置文件,仅在用户登录时执行一次
~/.profile用户登录时用户级别的配置文件,通常由sh、bash、ksh等解释执行
~/.zshrc用户登录时(zsh shell)用户级别的zsh配置文件,只对当前用户生效
/etc/profile.d/用户登录时(bash shell)目录包含由管理员提供的额外配置文件,以扩展/etc/profile
~/.config/environment.d/用户登录时目录包含用户特定的环境变量配置文件,以扩展~/.profile

查看当前shell加载的的环境变量内容:

r123@localhost:~$ env
SHELL=/bin/bash
WSL_DISTRO_NAME=Ubuntu
...

修改环境变量,这里以当前用户环境变量配置为例:

r123@localhost:~$ vim .profile
...
fi
export myself_var=2333
...   
:wq
r123@localhost:~$ source .profile
r123@localhost:~$ echo $myself_var
2333

预定义变量

预定义变量是在Shell脚本中由Shell环境提前定义好的一些特殊变量,用于存储系统信息、脚本运行时的状态等。这些变量在脚本执行期间自动设置,可以用于获取有关执行环境的信息或控制脚本的行为(其中$1$9也称为位置变量):

变量含义示例
$0脚本或命令本身的名称如果脚本名为 myscript.sh,则 $0myscript.sh
$1, $2, …传递给脚本或命令的位置参数,9之后的需要特殊定义$1 表示第一个参数,$2 表示第二个参数,以此类推
$#传递给脚本或命令的位置参数的总数,或变量的长度${#变量}如果有三个参数,$# 是 3
$*所有位置参数的单个字符串如果有参数为 arg1arg2$*arg1 arg2
$@所有位置参数的列表,每个参数作为一个单独的词如果有参数为 arg1arg2$@arg1arg2
$?上一个命令的退出状态(返回值),0是成功,非0即为失败echo $? 可以用于获取上一个命令的退出状态
$$当前Shell进程的进程IDecho $$ 显示当前Shell的进程ID
$!后台运行的上一个命令的进程ID在后台运行的命令结束后,$! 包含其进程ID
$USER当前用户的用户名echo $USER 显示当前登录用户的用户名
$HOME当前用户的主目录路径echo $HOME 显示当前用户的主目录路径
$SHELL当前用户使用的Shellecho $SHELL 显示当前用户使用的Shell
$PATHShell查找可执行文件的路径列表echo $PATH 显示Shell查找可执行文件的路径列表

在书写脚本时,我们可以做出以下的效果

ping -c 1 $1 &> /dev/null && echo "${1} is Up" || echo "${1} is Down"
echo success
r123@localhost:~$ vim ping.sh
r123@localhost:~$ bash ping.sh 192.168.179.11
192.168.179.11 is Down
success

条件控制

注意:条件测试不支持浮点值

数值比较

操作符描述用法
-eq等于(equal to)[ "$a" -eq "$b" ]
-ne不等于(not equal to)[ "$a" -ne "$b" ]
-lt小于(less than)[ "$a" -lt "$b" ]
-le小于等于(less than or equal to)[ "$a" -le "$b" ]
-gt大于(greater than)[ "$a" -gt "$b" ]
-ge大于等于(greater than or equal to)[ "$a" -ge "$b" ]

如果想要直接使用上述比较,需要通过 $?来获取运算结果:

r123@localhost:~$ [ 20 -gt 10 ]; echo $?
0
r123@localhost:~$ [ 20 -gt 30 ]; echo $?
1
r123@localhost:~$ [ 20-gt30 ]; echo $?
0

需要注意的是,这里的[]运算符需要与运算内容有空格,否则运算将无法识别

文件验证

指令描述用法
-e 文件路径检查文件或目录是否存在[ -e "$文件路径" ]
-f 文件路径检查文件是否为普通文件[ -f "$文件路径" ]
-d 文件路径检查文件是否为目录[ -d "$文件路径" ]
-s 文件路径检查文件是否存在且大小不为零[ -s "$文件路径" ]
-r 文件路径检查文件是否可读[ -r "$文件路径" ]
-w 文件路径检查文件是否可写[ -w "$文件路径" ]
-x 文件路径检查文件是否可执行[ -x "$文件路径" ]
-L 文件路径检查文件是否为符号链接[ -L "$文件路径" ]
-b 文件路径检查文件是否为块设备文件[ -b "$文件路径" ]
-g 文件路径检查文件是否具有设置了 SGID 位[ -g "$文件路径" ]

文件类型表格:

文件类型符号说明
普通文件-包含文本、二进制数据等,没有特殊属性。
目录d包含其他文件和目录的容器。
符号链接l指向另一个文件或目录的链接。
块设备文件b提供对设备的带缓冲的访问,如硬盘分区。
字符设备文件c提供对设备的不带缓冲的访问,如串口。
套接字文件s用于进程间通信的特殊文件。
管道文件p用于进程间通信的命名管道。

使用示例:

r123@localhost:~$ ll
total 44
drwxr-x--- 2 r123 r123 4096 Jan 20 00:13 ./
drwxr-xr-x 3 root root 4096 Jan 16 01:32 ../
-rw------- 1 r123 r123 3116 Jan 20 10:44 .bash_history
-rw-r--r-- 1 r123 r123  220 Jan 16 01:32 .bash_logout
-rw-r--r-- 1 r123 r123 3771 Jan 16 01:32 .bashrc
-rw------- 1 r123 r123   20 Jan 20 00:13 .lesshst
-rw-r--r-- 1 r123 r123    0 Jan 20 10:43 .motd_shown
-rw-r--r-- 1 r123 r123  807 Jan 19 15:34 .profile
-rw-r--r-- 1 r123 r123    0 Jan 19 14:47 .sudo_as_admin_successful
-rw------- 1 r123 r123 1444 Jan 19 15:44 .viminfo
-rw-r--r-- 1 r123 r123  127 Jan 17 22:52 MyMainClass.java
-rw-r--r-- 1 r123 r123  152 Jan 17 20:37 content.txt
-rw-r--r-- 1 r123 r123   83 Jan 19 15:44 ping.sh
r123@localhost:~$ [ -f MyMainClass.java ]; echo $?
0
r123@localhost:~$ [ -e MyMainClass.java ]; echo $?
0
r123@localhost:~$ [ -x MyMainClass.java ]; echo $?
1
r123@localhost:~$ [ -g MyMainClass.java ]; echo $?
1
r123@localhost:~$ sudo chmod g+s MyMainClass.java
r123@localhost:~$ [ -g MyMainClass.java ]; echo $?
0

字符串比较

  • 基础用法
r123@localhost:~$ [ "aaa" = "aaa" ]; echo $?
0
  • -z判断字符串长度是0
r123@localhost:~$ [ -z "233"  ]; echo $?
1
r123@localhost:~$ [ -z ""  ]; echo $?
0
  • 判断字符串长度不为0,未定义的变量也为0
r123@localhost:~$ [ -n "233"  ]; echo $?
0
r123@localhost:~$ [ -n ""  ]; echo $?
1

注意:当比较不存在变量时会出现以下情况

r123@localhost:~$ first_var=233
r123@localhost:~$ unset first_var
r123@localhost:~$ echo $first_varr123@localhost:~$ [ -z $first_var ]; echo $?
0
r123@localhost:~$ [ -n $first_var ]; echo $?
0
r123@localhost:~$ echo $first_var

多条件测试

  • and语法的三种形式
r123@localhost:~$ [ 22 -gt 23 -a 23 -gt 22 ]; echo $?
1
r123@localhost:~$ [[ 22 -gt 23 && 23 -gt 22 ]]; echo $?
1
r123@localhost:~$ [ 22 -gt 23 ] && [ 23 -gt 22 ]; echo $?
1
  • or语法的三种形式
r123@localhost:~$ [ 22 -gt 23 -o 23 -gt 22 ]; echo $?
0
r123@localhost:~$ [[ 22 -gt 23 || 23 -gt 22 ]]; echo $?
0
r123@localhost:~$ [ 22 -gt 23 ] || [ 23 -gt 22 ]; echo $?
0

模式匹配

利用linux的通配符来进行匹配条件

r123@localhost:~$ [[ 2 = [0-9] ]]; echo $?
0
r123@localhost:~$ [[ 20 = [0-9] ]]; echo $?
1

正则匹配

使用~表示进行正则匹配

r123@localhost:~$ [[ 20 =~ [0-9] ]]; echo $?
0
r123@localhost:~$ [[ a =~ [0-9] ]]; echo $?
1
r123@localhost:~$ [[ 1 =~ ^[0-9]$ ]]; echo $?
0
r123@localhost:~$ [[ 20 =~ ^[0-9]$ ]]; echo $?
1
r123@localhost:~$ [[ 2 =~ ^[0-9]$ ]]; echo $?
0

流程控制if语法

  • 单分支结构,当条件控制语句成立(返回值为0),输出Hello World
#!/bin/bashif [ 2 -gt 1 ]; thenecho "Hello World";
fi
r123@localhost:~$ cat if_test.sh#!/bin/bash
read -p "Please enter a username: " username
id $username &> /dev/null
if [ $? -eq 0 ]; thenecho "The username is exist"
fir123@localhost:~$ bash if_test.sh
Please enter a username: r123
The username is exist
  • 双分支结构
r123@localhost:~$ cat if_test.sh#!/bin/bash
read -p "Please enter a username: " username
id $username &> /dev/null
if [ $? -eq 0 ]
thenecho "The username is exist"elseecho "The username is not exist"
fir123@localhost:~$ bash if_test.sh
Please enter a username: r123
The username is exist
r123@localhost:~$ bash if_test.sh
Please enter a username: aaa
The username is not exist

这里使用了$?来避免了直接将命令作为条件传入if语句,也可以直接将命令作为条件

  • 多分支结构
#!/bin/bash
read -p "Please enter a time of only hour: " user_input_hourif [ $user_input_hour -gt 24 -o $user_input_hour -lt 0 ];
thenecho "Please enter a correct time"elif [ $user_input_hour -le 12 ]
then echo "It's ${user_input_hour} o'clock in the morning"elif [ $user_input_hour -gt 12 ]
thenecho "It's ${user_input_hour} o'clock in the afternoon"elseecho "Failed test"fi

使用bash -vx 脚本名可以进行调试脚本

r123@localhost:~$ bash -vx elif_test.sh
#!/bin/bash
read -p "Please enter a time of only hour: " user_input_hour
+ read -p 'Please enter a time of only hour: ' user_input_hour
Please enter a time of only hour: 12if [ $user_input_hour -gt 24 -o $user_input_hour -lt 0 ];
thenecho "Please enter a correct time"
...
elif [ $user_input_hour -gt 12 ]
thenecho "It's ${user_input_hour} o'clock in the afternoon"elseecho "Failed test"fi
+ '[' 12 -gt 24 -o 12 -lt 0 ']'
+ '[' 12 -le 12 ']'
+ echo 'It'\''s 12 o'\''clock in the morning'
It's 12 o'clock in the morning

在每一句要执行的语句处,将依次输出:原语句、进行操作(以+开头)、执行结果

模式匹配case语法

read -p "Please enter a number from 0 to 9 or a letter: "  user_input_valuecase $user_input_value in[0-9])echo "This is a number which in 1-9";;[a-zA-Z])echo "This is a letter";;*)echo "no";;
esac

匹配模式为模式匹配,并不能直接使用正则表达式,在每个模式匹配完成后需要使用两个分号,借助以上基础知识,我们可以写一个略微复杂的脚本

#!/bin/bash
web1=192.168.179.2
web2=192.168.179.3
web3=192.168.179.144
web4=192.168.179.145
web5=192.168.179.200cat <<EOF1.Web Server 1 ${web1}2.Web Server 2 ${web2}3.Web Server 3 ${web3}4.Web Server 4 ${web4}5.Web Server 5 ${web5}
EOFread -p "Please select a Web Server serial number: " select_rescase $select_res in
1)select_res=$web1;;
2)select_res=$web2;;
3)select_res=$web3;;
4)select_res=$web4;;
5)select_res=$web5;;
esacecho "The selected host to connect to is Web Server: "$select_resping -c 1 $select_res &> /dev/null && echo "${select_res} Up" || echo "${select_res} Down"echo "Execution is completed"

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

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

相关文章

在CentOS 7 中配置NFS服务器

目录 1、克隆两个虚拟机 2、安装 NFS 服务 3、NFS 服务使用 1、克隆两个虚拟机 nfs-servernfs-client&#xff08;修改ip地址&#xff09;[rootxnode1 ~]# cd /etc/sysconfig/network-scripts/[rootxnode1 network-scripts]# vi ifcfg-eno16777736 #修改内容如下 BOOTPROT…

【Oracle】ORA-32017和ORA-00384错误处理

文章目录 【Oracle】ORA-32017和ORA-00384错误处理问题描述问题原因和解决测试验证 【声明】文章仅供学习交流&#xff0c;观点代表个人&#xff0c;与任何公司无关。 编辑|SQL和数据库技术(ID:SQLplusDB) 收集Oracle数据库内存相关的信息 【Oracle】ORA-32017和ORA-00384错误…

Linux 常见性能指标 -- 磁盘

本系列记录操作系统常见性能指标&#xff0c;写这个主要是记录也是回顾&#xff0c;笔记很长&#xff0c;拆分了几个部分&#xff0c;本篇记录 磁盘 的性能指标 常见概念 响应时间 简单描述&#xff1a;I/O 请求从发出到收到响应的间隔时间 是衡量磁盘性能的关键指标&#x…

【QT+QGIS跨平台编译】之二:【zlib+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、zlib介绍二、文件下载三、文件分析四、pro文件五、编译实践 一、zlib介绍 zlib是一套通用的解压缩开源库&#xff0c;提供了内存&#xff08;in-memory&#xff09;压缩和解压函数。zlib是一套通用的解压缩开源库&#xff0c;提供了内存&#xff08;in-memory&am…

【小沐学GIS】基于C#绘制三维数字地球Earth(OpenGL)

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第二期3【小沐学GIS】…

DQL基础查询

DQL基础查询 ● DQL&#xff08;Data Query Language&#xff09;数据查询语言查询是使用频率最高的一个操作&#xff0c;可以从一个表中查询数据&#xff0c;也可以从多个表中查询数据。 ● 基础查询语法&#xff1a; select 查询列表 from 表名; ● 特点&#xff1a; 查询…

三、内存分配

1. JVM 简化架构概览 1.1 运行时数据区&#xff08;即内存区域&#xff0c;又称 JVM 内存结构&#xff09; 如上面的 JVM 简化架构图所示&#xff0c;内存区域分为如下五个部分&#xff08;这五个部分统称为运行时数据区&#xff09;&#xff1a; PC 寄存器&#xff08;又称程…

Python-setup进阶打包命令

一、setup.py文件的书写 这个资料有很多&#xff0c;不多赘述&#xff0c;setup 函数常用的参数如下&#xff1a; 基础描述信息&#xff1a; name 包名称&#xff08;起一个响亮的名字&#xff09;version (-V) 包版本author 程序的作者author_email 程序的作者的邮箱地址mai…

Kafka-服务端-DelayedOperationPurgatory

DelayedOperationPurgatory是一个相对独立的组件&#xff0c;它的主要功能是管理延迟操作。 DelayedOperationPurgatory的底层依赖于Kafka提供的时间轮实现。 我们可以使用JDK本身提供的java.util.Timer或是DelayQueue轻松实现定时任务的功能&#xff0c;为什么Kafka还要专门…

图像处理之《用于统一源跟踪和深度伪造检测的深度可分离水印SepMark》论文精读

一、文章摘要 恶意的Deepfakes导致了一场关于区分真脸和伪造脸的激烈冲突。尽管已经制定了许多事后检测Deepfakes的对策&#xff0c;但毫无疑问&#xff0c;在可预见的操作之前&#xff0c;被动取证没有考虑对原始人脸采取任何预防措施。为了完成这个取证生态系统&#xff0c;…

python函数的使用

一、函数的定义 Python使用保留字def定义一个函数&#xff0c;形式如下&#xff1a; def <函数名>&#xff08;<参数列表>&#xff09;&#xff1a; <函数体> return <返回值> 函数的调用过程与C语言类似。 关于一中特殊的函数——匿名函数&…

月薪2W的软件测试工程师,到底是做什么的?

在生活中&#xff0c;我们常常会遇到以下几种窘迫时刻&#xff1a; 准备骑共享单车出行&#xff0c;却发现扫码开锁半天&#xff0c;车子都没有反应&#xff1b;手机导航打车&#xff0c;却发现地图定位偏差很大&#xff0c;司机总是跑错地方&#xff1b;买个水&#xff0c;却…

使用flask_limiter限制接口访问速率的方法

flask_limiter 目录 flask_limiter1.简介2.安装3.初始化4.装饰器用法5.limit用法 1.简介 这里简单介绍了一些使用flask_limiter的方法。具体详细可参考官方文档 https://flask-limiter.readthedocs.io/en/stable/ 2.安装 pip install flask_socketio3.初始化 from flask i…

Redis实战之-分布式锁-redission

一、分布式锁-redission功能介绍 基于setnx实现的分布式锁存在下面的问题&#xff1a; 重入问题&#xff1a;重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中&#xff0c;可重入锁的意义在于防止死锁&#xff0c;比如HashTable这样的代码中&#xff0c;他的方法都…

面试高频知识点:1集合 1.1HashSet集合的特点

HashSet&#xff08;哈希集合&#xff09;是Java集合框架中的一种实现Set接口的类&#xff0c;它具有以下特点&#xff1a; 无序性&#xff1a; HashSet不保证元素的顺序&#xff0c;即元素在集合中的存储顺序与它们的插入顺序无关。这是因为HashSet使用哈希表来存储元素&#…

​第14节-高质量简历写作求职通关-在线测试

在线测试主要包括性格测试、综合能力测试、技能测试三类 性格测试 性格测试主要用于考察个人与工岗位的匹配程度 考察内容包含性格、能力、动机、价值观等&#xff0c;考察形式一般为给出相应的工作场景&#xff0c;让你选择最喜欢或者最不喜欢的答案 技能考试 这类测试一般是针…

SpringMVC第一天

简介 SpringMVC技术与Servlet技术功能等同&#xff0c;均属于web层开发技术 SpringMVC是一种基于java实现的MVC模型的轻量级Web框架 优点 使用简单,开发便捷(相比于Servlet) 灵活性强 入门案例 第一步、导入SpringMVC与Servlet坐标 <?xml version"1.0" encod…

(Bean工厂的后处理器入门)学习Spring的第七天

一 . Bean工厂的后处理器入门 : 直接上图 BeanDefinitionRegistyPostProcessor 为 BeanFactoryProcessor的子接口 , 前者先执行(图里只有Bean工厂的后处理器第一个类型) 如下图 : 这两个接口可改变两个Map(BeanDefinitionMap , singletonObject)里的信息 (黑马只讲了BeanFact…

打造更智能的应用 - 机器学习和Andorid

打造更智能的应用 - 机器学习和Andorid 一、关于机器学习和Andorid二、使用 Gemini 让您的 Android 应用如虎添翼2.1 Gemini API2.2 Android AICore 三、现成可用的还是自定义的机器学习3.1 机器学习套件 SDK 的常见用户流3.2 高性能自定义机器学习 四、机器学习套件 SDK&#…

透明拼接屏生产商:如何选择合格供应商

随着透明拼接屏市场的不断扩大&#xff0c;越来越多的生产商加入其中。对于需求方而言&#xff0c;选择一家合格的生产商至关重要。本文将围绕如何选择透明拼接屏生产商展开讨论&#xff0c;同时结合对尼伽OLED显示屏的了解&#xff0c;为您推荐这一领域的优质供应商。 一、透明…