bash引用-Quoting详细介绍
概述
- 引用的字面意思就是,用引号括住一个字符串。这可以保护字符串中的特殊字符不被shell或shell脚本重新解释或扩展。(如果一个字有不同于其字面意思的解释,它就是“特殊的”。例如:星号*除了本身代表*号以外还表示文件通配和正则表达式中的通配符)。
[root@centos8 ~]$ ls -l P*
Pictures:
total 0
Public:
total 0
[root@centos8 ~]$ ls -l 'P*'
ls: cannot access 'P*': No such file or directory
-  在生活中用语或者书写,当我们使用双引号"引用"一个句子时,我们会区别对待该句子并赋予其特殊意义;在Bash脚本中,当我们使用双引号"string"引用一个字符串时,我们同样区别对待并保护其字面意思(一般性的意思)。 
-  在涉及到命令替换时,引用可以让echo输出带格式的命令结果,保留变量所带的空白符号。 
bash$ echo $(ls -l)                 # 无引号命令替换
total 8 -rw-rw-r-- 1 bo bo 13 Aug 21 12:57 t.sh -rw-rw-r-- 1 bo bo 78 Aug 21 12:57 u.sh
bash$ echo "$(ls -l)"               # 被引用的命令替换
total 8-rw-rw-r--  1 bo bo  13 Aug 21 12:57 t.sh-rw-rw-r--  1 bo bo  78 Aug 21 12:57 u.sh
5.1. 引用变量(Quoting Variables)
-  当我们引用一个变量时,比较建议的做法是使用双引号将其引用起来。这样做可以避免bash再次解析双引号中的特殊字符(只不过:$、反引号`、和反斜杠\仍然会被bash解析)。在双引号中的$符号仍然被视为特殊字符,这样做的好处是可以进行变量替换(“$variable”),也就是使用变量的值替换掉变量名。 
-  使用双引号的另一个用途是防止单词分割。在双引号中的参数表现为单个词语(即使其包含空白字符)。 
List="one two three"
for a in $List     # 使用空格符作为分隔符分割变量的值(字符串).
doecho "$a"
done
# 输出
# one
# two
# three
echo "---"
for a in "$List"   # Preserves whitespace in a single variable.
do #     ^     ^echo "$a"
done
# 输出
# one two three
- 下面是一个更加精心设计的例子
variable1="a variable containing five words"
COMMAND This is $variable1    # 执行COMMAND命令时会被认为带了7个参数如下:
# "This" "is" "a" "variable" "containing" "five" "words"
COMMAND "This is $variable1"  # # 执行COMMAND命令时会被认为带了1个参数如下:
# "This is a variable containing five words"
variable2=""    # 空变量.
COMMAND $variable2 $variable2 $variable2# COMMAND命令没带参数执行. 
COMMAND "$variable2" "$variable2" "$variable2"# 带了三个空参数执行COMMAND命令. 
COMMAND "$variable2 $variable2 $variable2"# COMMAND命令带一个参数执行(该参数为2个空格). 
# 谢谢这个大佬指出:Stéphane Chazelas.
- 使用echo给标准输出打印奇怪的字符
例 5-1. echo输出奇怪的变量
#!/bin/bash
# weirdvars.sh: Echoing weird variables.
echo
var="'(]\\{}\$\""
echo $var        # '(]\{}$"
echo "$var"      # '(]\{}$"     结果相同.
echo
IFS='\'
echo $var        # '(] {}$"     \ 变为了空格,为什么?(IFS为内部域分割符,临时使用'\'作为分隔符)
echo "$var"      # '(]\{}$"
# 以上例子来自Stephane Chazelas.
echo
var2="\\\\\""
echo $var2       #   "
echo "$var2"     # \\"
echo
# 但是 ... var2="\\\\"" 是非法的?(此处四个\,位置2,4的两个刚好被转义,而剩余3个"符,所以不行)
var3='\\\\'
echo "$var3"     # \\\\
# 但是强引用可以.
# ************************************************************ #
# 变量嵌套替换也可以
echo "$(echo '"')"           # "
#    ^           ^
# 某些情况下嵌套很有用
var1="Two bits"
echo "\$var1 = "$var1""      # $var1 = Two bits
#    ^                ^
# Or, as Chris Hiestand points out ...
if [[ "$(du "$My_File1")" -gt "$(du "$My_File2")" ]]
#     ^     ^         ^ ^     ^     ^         ^ ^
then...
fi
# ************************************************************ #
-  单引号(’ ')的工作机制类似于双引号,但是在单括号中不允许变量替换,因为$符的特殊意义被关闭了。在单引号中任何特殊的符号都按照字面意思解释(除了’单引号自身)。 
-  由于转义符(逃逸符)在单引号中都失去了转义的意义,所以试图在单引号中括单引号是不行的,下面的例子可以实现输出单引号。 
echo "Why can't I write 's between single quotes"
echo
# The roundabout method.
echo 'Why can'\''t I write '"'"'s between single quotes'
#    |-------|  |----------|   |-----------------------|
# 上面使用了三个单引号组;一个转义的单引号和一个双引号引起的单引号.
5.2. 转义/逃逸(Escaping)
- 转义是一种用来引用单个字符的方法。在字符前的反斜杠\告诉shell以字面意思解析该字符。
注意:在echo或者sed这些程序命令中,转义某个字符可能有相反的作用,可以触发某种特殊意义。
特定的被转义的字符所具有的意义如下:
used with echo and sed
\n 新行(means newline)
\r 回车(means return)
\t tab键
\v 垂直tab键(means vertical tab)
\b 退格(means backspace)
\a 报警(means alert (beep or flash))
\0xx 将反斜杠后的数字视为八进制的ASCII码值
- $’ … ’ :该符号结构的机制是使用转义的八进制或者十六进制值将ASCII码赋给变量;例如:quote=$‘\042’.
例5-2. 被转义的字符(Escaped Characters)
#!/bin/bash
# escaped.sh: escaped characters
#############################################################
### First, let's show some basic escaped-character usage. ###
#############################################################
# Escaping a newline.
# ------------------
echo ""
echo "This will print
as two lines."
# 上面的写法将会打印两行
echo "This will print \
as one line."
# 上面的写法将会打印一行
echo; echo
echo "============="
echo "\v\v\v\v"      # 按照字面意思打印 \v\v\v\v .
# 使用 -e 选项 打印转义字符所代表的字符
echo "============="
echo "VERTICAL TABS" # 垂直tab键
echo -e "\v\v\v\v"   # 此时将会打印四个垂直tab
echo "=============="
echo "QUOTATION MARK"
echo -e "\042"       # 打印一个双引号 " (quote, 八进制的 ASCII 值:42;代表一个双引号).
echo "=============="
# 使用该结构 $'\X' 使得-e选项不在需要
echo; echo "NEWLINE and (maybe) BEEP"
echo $'\n'           # 新行.
echo $'\a'           # 警告音(beep).# May only flash, not beep, depending on terminal.
# We have seen $'\nnn" string expansion, and now . . .
# =================================================================== #
# $'\nnn' 该种字符串展开的机制在bash2.0中引进
# =================================================================== #
echo "Introducing the \$\' ... \' string-expansion construct . . . "
echo ". . . featuring more quotation marks."
echo $'\t \042 \t'   # 打印左右两边分别有个tab键的双引号(").
# '\nnn' 为八进制数.
echo
# 将一个ASCII字符赋值给一个变量
# ----------------------------------------
quote=$'\042'        # " 赋值给一个变量
echo "$quote Quoted string $quote and this lies outside the quotes."
echo
# Concatenating ASCII chars in a variable.
triple_underline=$'\137\137\137'  # 137 是八进制的ASCII值,代表'_'.
echo "$triple_underline UNDERLINE $triple_underline"
echo
ABC=$'\101\102\103\010'           # 101, 102, 103 分别代表 A, B, C.
echo $ABC
echo
escape=$'\033'                    # 033 是escape的八进制表示.
echo "\"escape\" echoes as $escape"
#                                   并无可视化的输出.
echo
exit 0
- 一个更加精心设计的例子
例5-3. 检测按键(Detecting key-presses)
#!/bin/bash
# Author: Sigurd Solaas, 20 Apr 2011
# Used in ABS Guide with permission.
# Requires version 4.2+ of Bash.
key="no value yet"
while true; doclearecho "Bash Extra Keys Demo. Keys to try:"#Bash 识别按键的demo.可以识别一下按键:echoecho "* Insert, Delete, Home, End, Page_Up and Page_Down"echo "* The four arrow keys"#四个方向键echo "* Tab, enter, escape, and space key"#tab,回车,返回,空格键echo "* The letter and number keys, etc."#标点按键echoecho "    d = show date/time"echo "    q = quit"echo "================================"echo# Convert the separate home-key to home-key_num_7:if [ "$key" = $'\x1b\x4f\x48' ]; thenkey=$'\x1b\x5b\x31\x7e'#   Quoted string-expansion construct. fi# Convert the separate end-key to end-key_num_1.if [ "$key" = $'\x1b\x4f\x46' ]; thenkey=$'\x1b\x5b\x34\x7e'ficase "$key" in$'\x1b\x5b\x32\x7e')  # Insertecho Insert Key;;$'\x1b\x5b\x33\x7e')  # Deleteecho Delete Key;;$'\x1b\x5b\x31\x7e')  # Home_key_num_7echo Home Key;;$'\x1b\x5b\x34\x7e')  # End_key_num_1echo End Key;;$'\x1b\x5b\x35\x7e')  # Page_Upecho Page_Up;;$'\x1b\x5b\x36\x7e')  # Page_Downecho Page_Down;;$'\x1b\x5b\x41')  # Up_arrowecho Up arrow;;$'\x1b\x5b\x42')  # Down_arrowecho Down arrow;;$'\x1b\x5b\x43')  # Right_arrowecho Right arrow;;$'\x1b\x5b\x44')  # Left_arrowecho Left arrow;;$'\x09')  # Tabecho Tab Key;;$'\x0a')  # Enterecho Enter Key;;$'\x1b')  # Escapeecho Escape Key;;$'\x20')  # Spaceecho Space Key;;d)date;;q)echo Time to quit...echoexit 0;;*)echo You pressed: \'"$key"\';;esacechoecho "================================"unset K1 K2 K3read -s -N1 -p "Press a key: "K1="$REPLY"read -s -N2 -t 0.001K2="$REPLY"read -s -N1 -t 0.001K3="$REPLY"key="$K1$K2$K3"
done
exit $?
\" 还原双引号的字面意思(就是双引号,不在用于引用)
echo "Hello"                     # Hello
echo "\"Hello\" ... he said."    # "Hello" ... he said.
$ 还原$符的字面意思,意思是在$后的变量不会被替换
echo "\$variable01"           # $variable01
echo "The book cost \$7.98."  # The book cost $7.98.
\\ 还原\的字面意思
echo "\\"  # Results in \
# Whereas . . .
echo "\"   # Invokes secondary prompt from the command-line.# In a script, gives an error message.
# However . . .
echo '\'   # Results in \
- 反斜杠\在不同的情况下表现出不一样的行为(是否被转义;是否位于强引用中;是否在弱引用中;是否在命令替换中;是否在“here document”)
                      #  简单的转义和引用
echo \z               #  z
echo \\z              # \z
echo '\z'             # \z
echo '\\z'            # \\z
echo "\z"             # \z
echo "\\z"            # \z#  命令替换
echo ècho \z`        #  z
echo ècho \\z`       #  z
echo ècho \\\z`      # \z
echo ècho \\\\z`     # \z
echo ècho \\\\\\z`   # \z
echo ècho \\\\\\\z`  # \\z
echo ècho "\z"`      # \z
echo ècho "\\z"`     # \z# 此处文本(Here document)
cat <<EOF              
\z                      
EOF                   # \z
cat <<EOF              
\\z                     
EOF                   # \z
# These examples supplied by Stéphane Chazelas.
- 赋给某个变量的字符串中的某些元素可能会被(能够被)转义,但是单个被转义的字符不一定可以赋给变量。
variable=\
echo "$variable"
# 不可行,打印一个错误提示:
# test.sh: : command not found
# 单独一个转义字符不可赋给变量
#
#  事实上此处转义字符 "\" 转义了新行(在编写比较长的命令时就可以使用一个转义符来将命令写成多行)
#+ 真正的行为是:        variable=echo "$variable"
#+                      把命令赋值给变量是不允许的
variable=\
23skidoo
echo "$variable"        #  23skidoo#  可行,因为第二行是合法的变量,且实际上第二行被转义成了第一。
variable=\ 
#        \^    转义符后跟一个空格 
echo "$variable"        # 输出空格
variable=\\
echo "$variable"        # \
variable=\\\
echo "$variable"
# 行不通,出错:
# test.sh: \: command not found
#
#  上面三个转义符中,第一个转义可第二个,但是第三个转义符还在,类似于第一个例子。
variable=\\\\
echo "$variable"        # \\# Second and fourth escapes escaped.# This is o.k.- 转义空格可以防止命令的参数列表发生词语分割。
- Escaping a space can prevent word splitting in a command’s argument list.
file_list="/bin/cat /bin/gzip /bin/more /usr/bin/less /usr/bin/emacs-20.7"
# List of files as argument(s) to a command.# Add two files to the list, and list all.
ls -l /usr/X11R6/bin/xsetroot /sbin/dump $file_list
echo "-------------------------------------------------------------------------"
# What happens if we escape a couple of spaces?
ls -l /usr/X11R6/bin/xsetroot\ /sbin/dump\ $file_list
输出:
################################
[root@centos8 ~]#ls -l /usr/X11R6/bin/xsetroot\ /sbin/dump\ $file_list
ls: cannot access '/usr/X11R6/bin/xsetroot /sbin/dump /bin/cat': No such file or directory
################################
# Error: the first three files concatenated into a single argument to 'ls -l'
#        because the two escaped spaces prevent argument (word) splitting.
- 转义也有"等待多行命令"的意思。一般的,不同的行会是不同的命令,但是行末的转义字符转义了新行的字符,命令可以一直写到下一行。
(cd /source/directory && tar cf - . ) | \
(cd /dest/directory && tar xpvf -)
# 该命令为Alan Cox写的拷贝命令,作两行写,增加了易读性。
# 下面的命令同样功能:
tar cf - -C /source/directory . |
tar xpvf - -C /dest/directory
# See note below.
# (Thanks, Stéphane Chazelas.)
- 如果脚本行结束跟一个|,一个管道符号,那么转义字符\,就不是那么严格的需要了。但是后面跟上转义字符是比较好的习惯。
echo "foo
bar" 
##两行
#foo
#bar
echo
echo 'foo
bar'    # 仍然是两行
#foo
#bar
echo
echo foo\
bar     # 换行符被转义输出一行.
#foobar
echo
echo "foo\
bar"     # 同样是一行,转义字符在弱引用中("\")不会丢掉其转义字符的特殊意义。
#foobar
echo
echo 'foo\
bar'     # 两行,因为转义字符在强引用('\')中失去了转义字符的意义,被bash按照字面意义解释。
#foo\
#bar
# Examples suggested by Stéphane Chazelas.
相关文章:
bash引用-Quoting详细介绍
bash引用-Quoting详细介绍 概述 引用的字面意思就是,用引号括住一个字符串。这可以保护字符串中的特殊字符不被shell或shell脚本重新解释或扩展。(如果一个字有不同于其字面意思的解释,它就是“特殊的”。例如:星号*除了本身代表*号以外还表…...
 
powershell几句话设置环境变量
设置环境变量比较繁琐,现在用这段话,在powershell中就可以轻松完成。 $existingPath [Environment]::GetEnvironmentVariable("Path", "Machine") $newPath "C:\Your\Path\Here"if ($existingPath -split ";"…...
 
Javascript 数据结构[入门]
作者:20岁爱吃必胜客(坤制作人),近十年开发经验, 跨域学习者,目前于海外某世界知名高校就读计算机相关专业。荣誉:阿里云博客专家认证、腾讯开发者社区优质创作者,在CTF省赛校赛多次取得好成绩。…...
 
IO(JavaEE初阶系列8)
目录 前言: 1.文件 1.1认识文件 1.2结构和目录 1.3文件路径 1.4文本文件vs二进制文件 2.文件系统的操作 2.1Java中操作文件 2.2File概述 2.2.1构造File对象 2.2.2File中的一些方法 3.文件内容的操作 3.1字节流 3.1.1InPutStream的使用方法 3.1.2OutPu…...
React Native 样式表的基础知识
在 React Native 中我们要使用组件元素进行样式设置的话,我们需要使用StyleSheet组件才能制定样式。useColorScheme是为 APP 定义颜色主题的。在此笔记中我们只是简单做一个介绍和使用。 使用StyleSheet定义样式 当我们要使用StyleSheet的话,我们需要引…...
【JS 解构赋值】
JS 解构赋值是 ES6 中一种简洁、高效的赋值方式,它可以将数组和对象中的值拆分出来并赋值给变量。 解构赋值 解构数组解构对象嵌套解构结语 解构数组 解构数组时,需要使用方括号 [] 包围变量名,并用逗号 , 将变量名隔开。 let [a, b, c] …...
 
Vue3状态管理库Pinia——自定义持久化插件
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…...
 
il汇编整数相加
在这里尝试了IL汇编字符串连接; IL汇编字符串连接_bcbobo21cn的博客-CSDN博客 下面来看一下IL汇编整数相加; 大概的看一下一些资料,下面语句, ldc.i4 20 ldc.i4 30 add 看上去像是,装载整数20到一个类似于…...
RabbitMQ 事务
事务简介 就像我们了解的MySQL中的事务一样,RabbiMQ的事务也具备原子性和一致性,并且RabbiMQ的事务是针对消息从生产者发送到RabbitMQ中提供的支持,因此不同事务可以同时给同一个队列发送信息。 可通过channel.txSelect,chann…...
vue前端 让年月日 加上23:59:59
yyyy/MM/dd HH:mm:ss 格式 // 获取 lateCreateTime 的原始时间戳 const timestamp new Date(this.queryAO.lateCreateTime).getTime();// 将时间戳转换为指定格式的字符串 const formattedDateTime new Date(timestamp).toLocaleString("zh-CN", {year: "num…...
 
【雕爷学编程】Arduino动手做(186)---WeMos ESP32开发板8
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&#x…...
 
STM32--综述
文章目录 前言STM32简介STM32F103C8T6系统结构Keil软件安装注意事项新建工程操作流程 前言 本专栏将学习B站江协科技的STM32入门教程,通过自身理解和对老师的总结所写的博客专栏。 STM32简介 STM32是意法半导体(STMicroelectronics)公司推…...
Linux学习之sed、awk和vim的差异
sed、awk和vim都是编辑器,区别如下: vim是交互式,需要跟用户进行互动,而sed和awk是非交互式,只需要写好命令,不用跟用户进行互动就可以完成任务。 vim是文本编辑器,操作的时候会对整个文件编辑&…...
 
MacOS上配置docker国内镜像仓库地址
背景 docker官方镜像仓库网速较差,我们需要设置国内镜像服务 我的MacOS docker版本如下 设置docker国内镜像仓库地址 点击Settings点击Docker Engine修改配置文件,添加registry-mirrors {"builder": {"gc": {"defaultKeepS…...
 
全志F1C200S嵌入式驱动开发(soc系统集成)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 任何一个嵌入式设备都是由很多的子系统组成的。这里面有硬件、有软件,还可能有机械,并不一定就是大家看到的消费电子那样,即一个soc构成了所有的系统。现实情况是,要构建一个系…...
React路由5版本
什么是路由? 一个路由就是一个映射关系(key:value). 以下代码用的都是router5 通过 npm install react-router-dom5 下载 所有路由用到的东西都需要从react-router-dom中引入 import {BrowserRouter,Link,Route,NavLink,Redirect,withRouter} from react-router-dom 1. 路…...
 
6.4.3 1x1卷积层
特点:1x1卷积层相当于全连接层 作用:1x1卷积用于调整网络层的通道数量和控制模型复杂度 输入形状:(通道,行,列) (3,3,3) 卷积核形状:(输出通道,输入通道,行,列) (2,3,…...
 
[CKA]考试之检查可用节点数量
由于最新的CKA考试改版,不允许存储书签,本博客致力怎么一步步从官网把答案找到,如何修改把题做对,下面开始我们的 CKA之旅 题目为: Task 检查集群中有多少节点为Ready状态(不包括被打上 Taint࿱…...
 
备考错题知识点总结
错题知识点总结 强化一,错题,范围管理,128题目 1 强化练习题 1 不理解的题目 4 什么玩意? 读不懂 你正在与产品负责人一起确定可行的产品迭代计划。 当你讨论各种特性并确定它们的优先级时,你们都在努力理解哪些特…...
初识Flask:Python轻量级Web框架入门教程
Flask是一个用Python编写的轻量级Web应用框架。由于其“微”性质,Flask在提供核心服务的同时,仍然提供了许多扩展的可能性。在这篇文章中,我们将从最基础开始,学习如何使用Flask构建一个Web应用。 一、安装与初次启动 首先&…...
 
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
 
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
 
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
 
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
 
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
 
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
 
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
 
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
