这是命令 zshexpn 可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
zshexpn - zsh 扩展和替换
商品描述
以下类型的扩展按指定顺序分五个步骤执行:
发展历程 扩展
这仅在交互式 shell 中执行。
别名 扩展
别名在解析命令行之前立即展开,如所解释的
在别名下 杂项(1)。
流程 换人
产品型号 扩展
命令 换人
算术 扩展
支撑 扩展
这五项操作以从左到右的方式一步执行。 在这些之后
扩展,所有未加引号的字符 `\',`''和`"' 是
除去。
文件名 扩展
如果 SH_FILE_EXPANSION 设置选项后,扩展顺序修改为
与...的兼容性 sh 和 KSH. 在这种情况下 文件名 扩张 被执行
之后立马 别号 扩张,在提到的五个扩展集之前
以上。
文件名 代
这种扩展,通常称为 通配,总是最后完成。
以下部分详细解释了扩展的类型。
历史 扩张
历史扩展允许您在命令行中使用以前命令行中的单词
你正在打字。 这简化了拼写更正和复杂的重复
命令或参数。
在执行之前,每个命令都会保存在历史列表中,其大小
是受 历史大小 范围。 始终保留最近的一条命令
任何状况之下。 历史列表中每条保存的命令称为历史记录 活动 提供美容纤体,
shell 启动时分配一个从 1(一)开始的数字。 历史编号
您可能会在提示中看到(请参阅提示序列的扩展) 杂项(1)) 是
要分配给的编号 下页 命令。
概述
历史扩展从第一个角色开始 历史字符 参数,即
`!' 默认情况下,可能出现在命令行的任何位置; 历史扩展不
巢。 的`!' 可以用 ` 转义\' 或者可以用一对单引号括起来
('') 来抑制其特殊含义。 双引号将 而不去 为此工作。 下列的
此历史字符是可选的事件指示符(请参阅“事件”部分)
指示符”),然后是可选的单词指示符(“单词指示符”部分); 如果
这些指示符都不存在,因此不会发生历史扩展。
包含历史扩展的输入行在扩展后但在任何扩展之前都会回显
其他扩展发生在命令执行之前。 就是这个展开的形式
并将其记录为历史事件,以供日后参考。
默认情况下,没有事件指示符的历史参考引用与任何事件相同的事件
该命令行上的先前历史参考; 如果它是唯一的历史参考
命令,它指的是上一个命令。 但是,如果该选项 CSH_JUNKIE_HISTORY is
设置,然后每个没有事件规范的历史参考 时刻 指的是
上一个命令。
例如,`!' 是前一个命令的事件指示符,因此 `!!:1' 总是指
到上一个命令的第一个单词,并且`!!$' 总是指最后一个词
上一个命令。 和 CSH_JUNKIE_HISTORY 设置,然后`!:1'和`!$' 功能相同
方式为`!!:1'和`!!$', 分别。 相反,如果 CSH_JUNKIE_HISTORY 未设置,
然后`!:1'和`!$' 分别指同一事件的第一个和最后一个词
由当前命令上最近的其他历史引用引用
行,或者如果没有前面的引用,则转到上一个命令。
字符序列`^FOO^酒吧'(其中`^' 实际上是第二个字符
历史字符 参数)重复上一个命令,替换字符串 FOO - 酒吧。 更多
准确地说,序列`^FOO^酒吧^' 与 ' 是同义词!!:s^FOO^酒吧^',因此其他
修饰符(参见“修饰符”部分)可以跟在最后的 `^'。 尤其,
`^FOO^酒吧^:G' 执行全局替换。
如果 shell 遇到字符序列 `!"' 在输入中,历史机制是
暂时禁用,直到当前列表(请参阅 杂项(1)) 已完全解析。 的`!"' 是
从输入中删除,以及任何后续的`!' 字符没有特殊意义。
提供了一种不太方便但更易于理解的命令历史记录支持形式
此 fc 内置。
创建 代号
事件指示符是对历史列表中命令行条目的引用。 在里面
下面列出,请记住最初的 '!' 每个项目中可能会更改为另一个字符
通过设置 历史字符 参数。
! 开始历史扩展,除非后面跟有空白、换行符、`=' 或`('.
如果紧随其后的是单词指示符(请参阅“单词指示符”部分),
这形成了没有事件指示符的历史参考(请参阅
“概述”)。
!! 参考上一条命令。 就其本身而言,此扩展重复了之前的内容
命令。
!n 参考命令行 n.
!-n 参考当前命令行减号 n.
!STR 请参阅以以下内容开头的最新命令 STR.
!?STR[?]
请参阅包含的最新命令 STR。 结尾的`?' 是必要的,如果
该引用后应跟有修饰符或后跟任何非
被视为一部分 STR.
!# 请参阅目前输入的当前命令行。 该线被视为好像
完整的直到并包括带有`的单词之前的单词!#' 参考。
!{...} 将历史引用与相邻字符隔离(如有必要)。
Word 代号
字指示符指示要包含给定命令行的哪个或哪些字
在历史参考文献中。 一个`:' 通常将事件规范与单词分开
指示符。 仅当单词指示符以 ` 开头时才可以省略^',`$',`*',
`-' 或`%'。 词指示符包括:
0 第一个输入词(命令)。
n 这款 nth 参数。
^ 第一个论点。 那是, 1.
$ 最后一个论点。
% 匹配的单词(最新的) ?STR 搜索。
x-y 一系列单词; x 默认为 0.
* 所有参数,如果没有则为空值。
x* 缩写`x-$'.
x- 喜欢`x*' 但省略了这个词 $.
请注意,一个`%' 字指示符仅在用于“之一”时才有效!%',`!:%' 或`!?STR?:%',
并且仅在使用后 !? 扩展(可能在较早的命令中)。 还要别的吗
导致错误,尽管该错误可能不是最明显的错误。
修饰符
在可选字指示符之后,您可以添加以下一个或多个序列
修饰符,每个修饰符前面都有一个 `:'。 这些修饰符也适用于以下结果 文件名
代 和 参数 扩张,除非另有说明。
a 将文件名转换为绝对路径:在当前目录前面添加,如果
必要的,并解决任何使用 `..'和`.' 在路径中。 请注意,
即使文件或任何中间目录不发生转换也会发生
存在。
A 作为`a',而且还尽可能解决符号链接的使用问题。 注意
的分辨率`..' 发生 before 符号链接的解析。 这个电话是
相当于 a 除非你的系统有 实路径 系统调用(现代系统
做)。
c 通过搜索给出的命令路径将命令名称解析为绝对路径
此 PATH 多变的。 这对于包含目录部分的命令不起作用。
另请注意,这通常不能用作 glob 限定符,除非文件
在当前目录中找到相同的名称。
e 删除文件扩展名中除了 ` 后面的部分之外的所有内容.'; 看到
描述中文件扩展名的定义 r 下面的修改器。
请注意,根据该定义,如果字符串结束,结果将为空
用`.'.
h 删除路径名尾部部分,保留头部。 这就像`目录名'.
l 将单词全部转换为小写。
p 打印新命令但不执行它。 仅适用于历史扩展。
q 引用被替换的单词,避免进一步的替换。 作品有历史
扩展和参数扩展,尽管对于参数来说,它只有在以下情况下才有用:
结果文本将被重新评估,例如 评估.
Q 从替换的单词中删除一层引号。
r 删除文件扩展名,保留根名称。 没有文件名的字符串
扩展名没有改变。 文件扩展名是`.' 后跟任意数量的
既不是 ` 的字符(包括零).'也不是`/'并且继续到
字符串的末尾。 例如,扩展名`foo.orig.c'是`.c'和
`目录.c/foo' 没有扩展名。
s/l/r[/]
替代 r l 如下所述。 仅对第一个进行替换
匹配的字符串 l。 对于数组和文件名生成,这适用于
扩展文本的每个单词。 有关替换的更多说明,请参阅下文。
形式`GS/l/r'和`s/l/r/:G' 进行全局替换,即替换
每次出现 r l。 请注意 g or :G 必须准确地出现在
显示位置。
请参阅下面有关这种替代形式的更多注释。
& 重复前面的 s 代换。 喜欢 s,前面可以紧接一个 g.
在参数展开中 & 必须出现在大括号内以及文件名生成中
必须用反斜杠引用它。
t 删除所有前导路径名组件,保留尾部。 这就像
`基本名'.
u 将单词全部转换为大写。
x 喜欢 q,但在空白处断言。 不适用于参数
扩张。
这款 s/l/r/ 替换工作如下。 默认情况下替换的左侧
不是模式,而是字符串。 任何字符都可以用作分隔符
`的地方/'。 反斜杠引用分隔符。 字符`&', 在里面
右侧 r, 被左侧的文本替换 l. 的`&' 可
用反斜杠引用。 空值 l 使用前一个字符串 l or
来自上下文扫描字符串 s 从`!?s'。 如果出现以下情况,您可以省略最右边的分隔符
紧接着换行 r; 最右边的`?' 在上下文扫描中同样可以是
省略。 注意与上次相同的记录 l 和 r 在所有形式中都得到维护
扩张。
请注意,如果一个`&' 在 glob 限定符中使用,需要额外的反斜杠作为 & 是一个
在这种情况下的特殊字符。
另请注意,扩展的顺序会影响对的解释 l 和 r。 使用时
在历史扩展中,该扩展发生在任何其他扩展之前, l 和 r 被视为
文字字符串(除非解释为 HIST_SUBST_PATTERN 以下)。 当用于
参数扩展,替换 r 首先完成参数值的输入,并且
那么任何附加的过程、参数、命令、算术或大括号引用都是
应用,它可以多次评估这些替换和扩展,如果 l 出现
超过起始值一次。 当在 glob 限定符中使用时,任何替换或
扩展在解析限定符时执行一次,甚至在`之前:s'
表达式本身分为 l 和 r 两侧。
如果是选项 HIST_SUBST_PATTERN 设置, l 被视为通常形式的模式
在下面的文件名生成部分中进行了描述。 这个可以用在所有地方
哪里有可用的修饰符; 但请注意,在通配限定符参数中
替换已经发生,因此替换字符串中的参数应该是
报价以确保在正确的时间进行更换。 还要注意复杂的
通配限定符中使用的模式可能需要扩展通配符限定符表示法
(#q:s/.../.../) 为了让 shell 将表达式识别为 glob 限定符。
此外,请注意,替换中的不良模式不受 NO_BAD_PATTERN
选项所以会导致错误。
什么时候 HIST_SUBST_PATTERN 设置, l 可能以一个开头 # 表明该模式必须
匹配要替换的字符串的开头,以及 % 可能出现在开头或
之后 # 指示模式必须在字符串末尾匹配
取代。 这 % or # 可以用两个反斜杠引用。
例如,以下一段文件名生成代码 EXTENDED_GLOB
选项:
打印 *.c(#q:s/#%(#b)s(*).c/'S${match[1]}.C'/)
需要展开 *。C 并在中应用 glob 限定符 (#q...) 表达,
它由锚定到每个单词的开头和结尾的替换修饰符组成(#%).
这将打开反向引用((#b)),这样括号内的子表达式就可用
在替换字符串中为 ${匹配[1]}。 替换字符串被引用,以便
在文件名生成开始之前,参数不会被替换。
下列 f, F, w 和 W 修饰符仅适用于参数扩展和文件名
一代。 此处列出它们是为了为所有人提供单一参考点
修饰符。
f 重复紧随其后(不带冒号)的修饰符,直到结果
这个词不再改变。
F:表达式:
喜欢 f,但仅重复 n 次如果表达式 表达式 评估为 n。 任何
可以使用字符代替 `:'; 如果`(',`[',或`{' 用作
开始分隔符,结束分隔符应该是 ')',`]',或`}', 分别。
w 使紧随其后的修饰符作用于字符串中的每个单词。
W:九月: 喜欢 w 但单词被认为是字符串中由 分隔的部分
九月。 可以使用任何字符代替 `:'; 左括号已处理
特别是,见上文。
疗程开始前 代换
命令参数的每个部分采用以下形式:<(名单)',`>(名单)' 或`=(名单)' 是
受工艺替代的影响。 该表达式之前或之后可以是其他表达式
字符串不同的是,为了防止与常见的字符串和模式发生冲突,
最后一个形式必须出现在命令参数的开头,并且形式仅展开
当第一次解析命令或赋值参数时。 可以使用流程替代
遵循重定向运算符; 在这种情况下,替换必须出现且没有
尾随字符串。
在的情况下 < or > 形式,shell 运行命令 名单 作为一个子过程
执行 shell 命令行的作业。 如果系统支持 /开发/FD 机制,
命令参数是文件描述符对应的设备文件的名称;
否则,如果系统支持命名管道(FIFO),则命令参数将是
命名管道。 如果表格带有 > 选择然后在这个特殊文件上写入将提供
输入 名单。 如果 < 使用,那么作为参数传递的文件将连接到
的输出 名单 过程。 例如,
糊 <(切 -f1 file1) <(切 -f3 file2) |
开球 >(进程1) >(进程2) > / dev /空
从文件中删除字段 1 和 3 file1 和 file2 分别粘贴结果
一起发送给进程 进程1 和 进程2.
If =(...) 来代替 <(...),那么作为参数传递的文件将是名称
包含输出的临时文件 名单 过程。 可以用这个代替
的 < 期望 lseek 的程序的形式(参见 寻求(2)) 在输入文件上。
对形式的替换进行了优化 =(<<ARG),其中 ARG 是一个
这里字符串重定向的单字参数 <<。 这种形式产生一个文件名
包含的值 ARG 执行任何替换后。 这是处理的
完全在当前 shell 内。 这实际上与特殊形式相反
$(ARG) 哪个治疗 ARG 作为文件名并将其替换为文件的内容。
这款 = 形式很有用,因为 /开发/FD 和命名管道实现 <(...) 它们在许多情况下都能提供类似的结果。
缺点。 在前一种情况下,某些程序可能会自动关闭文件
在命令行上检查文件之前有问题的描述符,特别是如果这样
出于安全原因(例如当程序运行 setuid 时)是必要的。 在里面
第二种情况,如果程序实际上没有打开文件,子 shell 会尝试
从管道中读取或写入将(在典型的实现中,不同的操作
系统可能有不同的行为)永远阻塞并且必须明确地终止。 在
在这两种情况下,shell 实际上都使用管道提供信息,以便程序
期望 lseek (参见 寻求(2)) 对文件不起作用。
另请注意,前面的示例可以写得更紧凑、更高效
(前提是 多路亚 选项设置)为:
糊 <(切 -f1 file1) <(切 -f3 file2) \
> >(进程1) > >(进程2)
shell 使用管道而不是 FIFO 来实现后两个进程替换
上面的例子。
还有一个额外的问题 >(过程); 当它连接到外部时
命令,父 shell 不等待 过程 完成,因此立即
以下命令不能依赖完整的结果。 问题及解决方案是
与本节中描述的相同 多路亚 in 杂项(1). 因此在简化版本中
上面的例子:
糊 <(切 -f1 file1) <(切 -f3 file2) > >(过程)
(请注意,没有 多路亚 参与), 过程 将异步运行至
父 shell 涉及。 解决方法是:
{ 糊 <(切 -f1 file1) <(切 -f3 file2) } > >(过程)
这里的额外进程是从父 shell 中生成的,父 shell 会等待它们的进程
完成。
每当有需要临时文件的替换作业时,就会出现另一个问题
被 shell 否认,包括`&!' 或`&|' 出现在 a 的末尾
包含替换的命令。 在这种情况下,临时文件将不会被清理
因为 shell 不再有该工作的任何记忆。 解决方法是使用子 shell,例如
例,
(mycmd =(我的输出)) &!
因为分叉的子 shell 将等待命令完成然后删除临时文件。
确保流程替换持续适当长度的一般解决方法
时间就是将它作为参数传递给匿名shell函数(一段shell代码
立即在函数范围内运行)。 例如,这段代码:
() {
打印 文件 $ 1:
猫 $1
} =(打印 本篇 be 此 诗)
输出类似以下内容
文件 /tmp/zsh6nU0kS:
本篇 be 此 诗
当函数执行时,进程替换创建的临时文件将被删除
退出。
参数 扩张
字符`$' 用于引入参数扩展。 看 参数(1) 对于一个
参数的描述,包括数组、关联数组和下标表示法
访问各个数组元素。
特别注意,未加引号的参数的单词不会自动拆分
除非有选项,否则在空白处 SH_WORD_SPLIT 已设置; 请参阅下面对此选项的引用
更多细节。 这是与其他 shell 的一个重要区别。
在下面讨论的需要模式的扩展中,模式的形式是
与用于文件名生成的相同; 请参阅“文件名生成”部分。 笔记
这些模式以及任何替换的替换文本本身就是
受参数扩展、命令替换和算术扩展的影响。 在
除了以下操作之外,本节中描述的冒号修饰符
可以应用“历史扩展”部分中的“修饰符”:例如,
${i:s/foo/bar/} 对参数扩展执行字符串替换 $i.
${姓名}
参数的值(如果有) 姓名 被替换。 大括号是必需的
如果扩展后跟字母、数字或下划线,则不要
被解释为一部分 姓名。 此外,还有更复杂的形式
替换通常需要大括号存在; 例外情况,仅适用
如果选项 KSH_数组 未设置,是单个下标还是任何冒号修饰符
出现在名称或任何字符`之后^',`=',`~',`#' 或`+'
出现在名称之前,所有这些都可以带或不带大括号。
If 姓名 是一个数组参数,并且 KSH_数组 选项未设置,则该值
每个元素的 姓名 被替换,每个单词一个元素。 否则,
扩展结果仅是一个单词; 和 KSH_数组,这是第一个元素
数组。 不对结果进行字段分割,除非 SH_WORD_SPLIT 选项
已设置。 另请参阅标志 = 和 s:绳子:.
${+姓名}
If 姓名 是一组参数的名称 `1' 被替换,否则 `0' 是
取代。
${姓名-字}
${姓名:-字}
If 姓名 已设置,或者在第二种形式中为非空,则替换其值;
否则替代 字。 在第二种形式中 姓名 可以省略,在这种情况下
字 总是被替换。
${姓名+字}
${姓名:+字}
If 姓名 已设置,或在第二种形式中为非空,则替换 字; 除此以外
什么都不能替代。
${姓名=字}
${姓名:=字}
${姓名:: =字}
在第一种形式中,如果 姓名 未设置然后将其设置为 字; 在第二种形式中,如果
姓名 未设置或为 null,然后将其设置为 字; 在第三种形式中,无条件地
集 姓名 至 字。 在所有形式中,参数的值都会被替换。
${姓名?字}
${姓名:?字}
在第一种形式中,如果 姓名 已设置,或者采用第二种形式,如果 姓名 既已设置且
非空,然后替换它的值; 否则,打印 字 并退出外壳。
交互式 shell 而是返回到提示符。 如果 字 被省略,那么a
打印标准消息。
在上述任何测试变量并替换替代变量的表达式中 字,
请注意,您可以在 字 值来选择性地覆盖
分裂由 SH_WORD_SPLIT 选项和 = 标志,但不被分割
s:绳子: 旗。
在下列表达式中,当 姓名 是一个数组并且替换没有被引用,或者
如果`(@)' 标志或 姓名[@] 使用语法,进行匹配和替换
每个数组元素分开。
${姓名#模式}
${姓名##模式}
如果 模式 匹配值的开头 姓名,然后代入
价值 姓名 删除匹配部分; 否则,只需替换
价值 姓名。 第一种形式,优先选择最小的匹配模式; 在
第二种形式,优先选择最大的匹配模式。
${姓名%模式}
${姓名%%模式}
如果 模式 匹配值的结尾 姓名,然后代入值
姓名 删除匹配部分; 否则,只需替换为
姓名。 第一种形式,优先选择最小的匹配模式; 在第二
形式,优先选择最大的匹配模式。
${姓名:#模式}
如果 模式 匹配的值 姓名,然后替换为空字符串;
否则,只需替换为 姓名。 如果 姓名 是一个匹配的数组
数组元素被删除(使用`(M)' 标志以删除不匹配的元素)。
${姓名:|数组名}
If 数组名 是数组变量的名称(注意,不是内容),然后是任何
所含元素 数组名 从替换中删除 姓名。 如果
替换是标量,因为 姓名 是标量变量或表达式
被引用,元素 数组名 相反,针对整个测试
表达。
${姓名:*数组名}
与前面的替换类似,但意义相反,因此条目
既存在于原始替代中又作为元素 数组名 被保留
和其他人删除。
${姓名:^数组名}
${姓名:^^数组名}
压缩两个数组,使得输出数组的长度是最短数组的两倍
(最长的`:^^') 的 姓名 和 数组名,元素交替为
从他们那里挑选的。 对于`:^',如果输入数组之一较长,则输出将
当到达较短数组的末尾时停止。 因此,
一个=(1 2 3 4); b=(a b); 打印 ${a:^b}
将输出`1 a 2 b'。 对于`:^^',然后重复输入,直到所有的
较长的数组已用完,上面将输出`1 a 2 b 3 a 4 b'.
一个或两个输入都可以是标量,它们将被视为长度为 1 的数组
将标量作为唯一元素。 如果其中一个数组为空,则另一个数组为
没有插入额外元素的输出。
目前以下代码将输出`a b'和`1' 作为两个独立的元素,
这可能是意想不到的。 第二次打印提供了一个解决方法,应该
如果更改,请继续工作。
一个=(一个 b); b=(1 2); 打印 -l "${a:^b}"; 打印 -l “${${a:^b}}”
${姓名:抵消}
${姓名:抵消:长度}
此语法提供类似于以下形式的参数下标的效果
$姓名[开始,结束],但与其他 shell 兼容; 请注意,两者 抵消 和
长度 与下标的组成部分的解释不同。
If 抵消 是非负数,那么如果变量 姓名 是一个标量替代
内容开始 抵消 从字符串的第一个字符开始的字符,如果
姓名 是一个数组替换元素开始 抵消 从第一个开始的元素
元素。 如果 长度 给定,替换许多字符或元素,
否则标量或数组的整个其余部分。
积极的 抵消 始终被视为字符或元素的偏移量 姓名
从数组的第一个字符或元素开始(这与原生 zsh 不同)
下标符号)。 因此 0 指的是第一个字符或元素,无论
选项的设置 KSH_数组.
负偏移量从标量或数组的末尾向后计数,因此 -1
对应于最后一个字符或元素,依此类推。
当积极时, 长度 从计数 抵消 接近标量末尾的位置
或数组。 当负值时, 长度 从末尾倒数。 如果这导致
位置小于 抵消,打印诊断信息并且不进行任何替换。
选项 多字节 遵守,即偏移量和长度计数多字节
适当的字符。
抵消 和 长度 经历与标量相同的一组 shell 替换
任务; 此外,还要对它们进行算术评估。 因此,
例如
打印 ${foo:3}
打印 ${富: 1 + 2}
打印 ${foo:$(( 1 + 2))}
打印 ${foo:$(回声 1 + 2)}
都有相同的效果,提取从第四个字符开始的字符串
$ foo 如果替换将返回一个标量,或者从以下位置开始的数组
第四个元素如果 $ foo 将返回一个数组。 请注意,使用该选项
KSH_数组 $ foo 总是返回一个标量(无论使用偏移量
语法)和一种形式,例如 $foo[*]:3 需要提取数组的元素
命名 FOO.
If 抵消 是负数, - 可能不会立即出现 : 这样
表示 ${姓名:-字} 替代形式。 相反,可以插入一个空格
前 -。 此外,也不 抵消 也不 长度 可能以字母开头
字符或 & 因为它们用于指示历史风格修饰符。 到
替换变量中的值,建议的方法是在它前面加上
a $ 因为这表示意图(参数替换可以很容易地呈现
无法阅读); 然而,当执行算术替换时,表达式
${变量: 关闭} 确实有效,检索偏移量 折扣美元.
为了进一步与其他 shell 兼容,有一个数组的特殊情况
偏移量 0。这通常访问数组的第一个元素。 然而,如果
替换是指位置参数数组,例如 $@ or $*,然后偏移
0 代替指的是 $0,偏移量1指的是 $1, 等等。 换句话说,
位置参数数组通过前置有效地扩展 $0。 因此
${*:0:1} 替代品 $0 和 ${*:1:1} 替代品 $1.
${姓名/模式/代表}
${姓名//模式/代表}
替换最长的可能匹配 模式 在参数展开中 姓名 by
绳子 代表。 第一种形式仅替换第一次出现的情况,第二种形式
所有发生的情况。 两个都 模式 和 代表 受到双引号替换的影响,
这样表达式就像 ${名称/$opat/$npat} 会起作用,但请注意通常的规则
该模式中的字符 $奥帕特 不会受到特殊对待,除非有两种选择
GLOB_SUBST 已设置,或 $奥帕特 而是替换为 ${~奥帕特}.
这款 模式 可能以`开头#',在这种情况下 模式 必须在开始时匹配
字符串的,或`%',在这种情况下它必须匹配字符串的末尾,或者
`#%'在这种情况下 模式 必须匹配整个字符串。 这 代表 可能是一个
空字符串,在这种情况下最后的`/' 也可以省略。 引用最后的
`/' 在其他情况下,它前面应该有一个反斜杠; 这不是
必要时,如果`/' 出现在替换参数内。 另请注意,
`#',`%'和`#% 如果它们出现在替换参数内,则不处于活动状态,即使
在开始时。
第一个`/' 前面可以有一个 `:',在这种情况下匹配才会成功
如果它匹配整个单词。 还要注意的效果 I 和 S 参数
下面的扩展标志; 然而,旗帜 M, R, B, E 和 N 没有用。
例如,
foo=“闪烁” 眨眼 小 星星” 子=“t*e” 代表=“间谍”
打印 ${foo//${~sub}/$rep}
打印 ${(S)foo//${~sub}/$rep}
在这里,`~' 确保文本 $子 被视为模式而不是
普通字符串。 在第一种情况下,最长的匹配 t*e 被替换并且
结果是`间谍 明星',而在第二种情况下,将采用最短的匹配,并且
结果是`间谍 间谍 口齿不清 明星'.
${#规格}
If 规格 是上述替换之一,替换为字符长度
结果而不是结果本身。 如果 规格 是一个数组表达式,
替换结果的元素数量。 这有一个副作用
即使在引用形式中也会跳过连接,这可能会影响中的其他子表达式
规格。 请注意`^',`=',和`~下面的 ' 必须出现在 ` 的左侧#' 什么时候
这些形式被组合起来。
如果是选项 POSIX_标识符 未设置,并且 规格 是一个简单的名字,那么
大括号是可选的; 即使对于特殊参数也是如此,例如 $#- 和 $#*
取字符串的长度 $- 和数组 $* 分别。 如果
POSIX_标识符 已设置,则需要大括号 # 在此进行治疗
时尚。
${^规格}
打开 RC_EXPAND_PARAM 评估选项 规格; 如果`^' 是
双倍,关掉它。 设置此选项后,数组扩展形式为
FOO${xx}酒吧,其中参数 xx 被设置为 (a b c),替换为
`福巴 足球吧 食品吧' 而不是默认的 `吃货 b 酒吧'。 请注意,一个空
因此,数组将导致所有参数被删除。
在内部,每个这样的扩展都会转换为大括号的等效列表
扩张。 例如, ${^var} 成为 {$var[1],$var[2],...},并被处理为
在下面的“支撑扩展”部分中进行了描述。 如果分词也在
影响 $var[N] 本身可以分为不同的列表元素。
${=规格}
使用以下规则执行分词 SH_WORD_SPLIT 评估期间
规格,但不管参数是否出现在双引号中; 如果`='
翻倍了,关掉它。 这迫使参数扩展被分成
在替换之前分隔单词,使用 IFS的 作为分隔符。 这是由
大多数其他 shell 中的默认值。
请注意,分割适用于 字 在作业形式中 规格 before 此
分配给 姓名 被执行。 这会影响数组赋值的结果
此 A 旗。
${~规格}
打开 GLOB_SUBST 评估选项 规格; 如果`~' 被加倍,
把它关掉。 设置此选项后,扩展产生的字符串将
在任何可能的地方被解释为模式,例如在文件名中
扩展和文件名生成以及模式匹配上下文,如右手
的一侧`='和`!=' 条件中的运算符。
在嵌套替换中,请注意 ~ 适用于结果
当前的替代水平。 对结果的周围模式操作可能
取消它。 因此,例如,如果参数 FOO 被设置为 *, ${~foo//\*/*.c}
被模式替换 *。C,可以通过文件名生成来扩展,
但是 ${${~foo}//\*/*.c} 替换为字符串 *。C,这不会进一步
扩大了。
如果一个 ${...} 类型参数表达式或 $(...) type 命令替换用于
的地方 姓名 上面,它首先被扩展,并且结果被用作值,就好像它是值一样
of 姓名。 因此可以执行嵌套操作: ${${foo#head}%tail}
替代的值 $ foo 与两个`头'和`尾巴' 已删除。 表格与 $(...)
与接下来描述的标志结合使用通常很有用; 请参阅下面的示例。
每 姓名 或嵌套 ${...} 在参数扩展中也可以跟一个下标
表达式如描述 排列 参数 in 参数(1)。
请注意,嵌套表达式周围可能会出现双引号,在这种情况下,只有部分
内部被视为引用; 例如, ${(f)"$(foo)"} 引用结果 $(富),但
旗帜`(六)' (见下文)使用不带引号的扩展规则进行应用。 笔记
此外,引号本身嵌套在这种上下文中; 例如,在
“${(@f)”$(foo)“}”,有两组引号,一组围绕整个表达式,
周围的其他(冗余) $(富) 像之前一样。
产品型号 扩展 旗
如果左大括号后面直接跟有左括号,则字符串直到
匹配的右括号将被视为标志列表。 如果重复某个
flag有意义,重复不必是连续的; 例如,`(q%q%q)' 方法
与更具可读性的 `( 相同%%QQ)'。 支持以下标志:
# 将结果单词评估为数字表达式并输出字符
对应于结果整数。 请注意,这种形式是完全不同的
从使用 # 没有括号。
如果 多字节 设置了选项并且数量大于 127(即不是
ASCII 字符)它被视为 Unicode 字符。
% 展开全部 % 结果单词中的转义方式与提示中的转义方式相同(请参阅
提示序列的扩展 杂项(1))。 如果此标志被给出两次,则已满
根据结果单词的设置进行提示扩展
PROMPT_PERCENT, 提示_SUBST 和 提示音 选项。
@ 在双引号中,数组元素被放入单独的单词中。 例如,`“${(@)foo}”'
相当于`“${foo[@]}”'和`“${(@)foo[1,2]}”' 等同于 `“$foo[1]”
“$foo[2]”'。 这与 部分 分裂 由 f, s or z 标志,其中
仍然适用于每个数组元素。
A 使用`创建一个数组参数${...=...}',`${...:=...}' 或`${...:: =...}'。 如果
该标志被重复(如`AA'),创建一个关联数组参数。
在排序或填充之前进行赋值; 如果字段分割处于活动状态,则
字 部分在分配之前被分割。 这 姓名 部分可能是下标范围
普通数组; 这 字 部分 必须 转换为数组,例如使用
`${(AA)=姓名=...}' 在创建关联数组时激活字段分割。
a 按数组索引顺序排序; 当与`结合使用时O' 按反向数组索引排序
命令。 请注意`a' 因此相当于默认值,但是 `Oa' 对于
以相反的顺序获取数组的元素。
b 仅用反斜杠引用模式匹配特有的字符。 这
当要使用以下命令测试变量的内容时很有用 GLOB_SUBST,
包括 ${~...} 开关。
使用其中之一引用 q 标志系列不适用于此目的,因为
引号不会从非模式字符中剥离 GLOB_SUBST。 换一种说法,
模式=${(q)str}
[[ $海峡 = ${~模式} ]]
工作,如果 $海峡 是`a*b' 但如果是 ' 则不然a b', 然而
模式=${(b)str}
[[ $海峡 = ${~模式} ]]
对于任何可能的值始终为真 $海峡.
c 通过 ${#姓名},计算数组中的字符总数,就好像元素一样
之间用空格连接。 这不是数组的真正连接,
因此与此标志一起使用的其他表达式可能会影响
计算之前的数组。
C 将结果单词大写。 在这种情况下,“单词”指的是
由非字母数字分隔的字母数字字符, 而不去 结果的话
来自字段分裂。
D 假设字符串或数组元素包含目录并尝试替换
其中的主要部分是名称。 路径的其余部分(如果是则整个路径
前导部分未被替换)然后被引用,以便整个字符串可以
用作 shell 参数。 这是`的相反~' 替换:参见
下面的文件名扩展部分。
e 演出 参数 扩张, 命令 代换 和 算术 扩张 在
结果。 此类扩展可以嵌套,但递归太深可能会产生不可预测的结果
影响。
f 在换行符处拆分扩展结果。 这是`的简写ps:\n:'.
F 使用换行符作为分隔符将数组的单词连接在一起。 这是一个
`的简写pj:\n:'.
g:选择:
当没有给出选项时,像内置的 echo 一样处理转义序列(G::).
随着 o 选项,八进制转义符不带前导零。 随着 c 选项,
像`这样的序列^X' 也被处理。 随着 e 选项,处理`\公吨'和
类似于 print 内置的序列。 与两者 o 和 e 期权,
行为类似于 print 内置函数,只是在这些模式中都不是 `\c'
解释。
i 排序时不区分大小写。 可以与`结合使用n' 或`O'.
k If 姓名 引用关联数组,替换 键 (元素名称)而不是
比元素的值。 与下标一起使用(包括普通数组),
强制替换索引或键,即使下标形式指的是
价值观。 但是,该标志不能与下标范围组合。
L 将结果中的所有字母转换为小写。
n 对十进制整数进行数字排序; 如果两个测试的第一个不同字符
字符串不是数字,排序是词法的。 具有更多初始零的整数是
排序在那些较少或没有的之前。 因此数组`富1 富02 富2 富3
富20 富23' 按所示顺序排序。 可以与`结合使用i' 或`O'.
o 将结果单词按升序排序; 如果这单独出现,则排序
是词法且区分大小写的(除非区域设置使其不区分大小写)。
按升序排序是其他排序形式的默认排序,所以这是
如果与 ` 组合则被忽略a',`i' 或`n'.
O 将结果单词按降序排序; `O' 没有 'a',`i' 或`n' 排序在
颠倒词汇顺序。 可以与`结合使用a',`i' 或`n' 颠倒顺序
的排序。
P 这强制参数的值 姓名 进一步解释为
参数名称,其值将在适当的情况下使用。 请注意,设置了标志
与之一 排版 命令族(特别是转换)是
不应用于 的值 姓名 以这种方式使用。
如果与嵌套参数或命令替换一起使用,其结果将是
以同样的方式作为参数名称。 例如,如果您有`富=酒吧'和
`酒吧=巴兹',字符串 ${(P)foo}, ${(P)${foo}}及 ${(P)$(回声 酒吧)} 会
扩展到`巴兹'.
q 在结果单词中引用 shell 特有的字符
反斜杠; 不可打印或无效的字符使用 $'\NNN' 形成,
每个八位位组都有单独的引号。
如果此标志被给出两次,则结果单词用单引号引起来,并且如果
给出了 XNUMX 次,单词用双引号引用; 在这些形式中没有
尝试对不可打印或无效字符进行特殊处理。 如果标志是
给出四次,单词用单引号引用,前面加一个 $。 注意
在所有这三种形式中,引用都是无条件完成的,即使这不
更改 shell 解释结果字符串的方式。
如果一个 q- 给出(只有一个 q 可能会出现),单引号的最小形式是
仅在需要保护特殊字符时才使用引号引用字符串。
通常,这种形式提供最易读的输出。
Q 从结果单词中删除一层引号。
t 使用描述参数类型的字符串,其中参数值
通常会出现。 该字符串由用连字符分隔的关键字组成(`-“)。
字符串中的第一个关键字描述主要类型,它可以是`之一纯量',
`排列',`整数',`浮动' 或`协会'。 其他关键字描述类型
更详细地:
本地 对于本地参数
左 对于左对齐参数
右空白
对于带有前导空格的右对齐参数
右零
对于带有前导零的右对齐参数
降低 对于其值被转换为全部小写的参数,当它是
扩大
上 对于其值转换为全部大写的参数
扩大
只读
对于只读参数
行李牌 对于标记参数
出口 对于导出的参数
独特 对于仅保留第一次出现的重复值的数组
隐藏 对于带有“隐藏”标志的参数
希德瓦尔
对于带有“hideval”标志的参数
特别
对于 shell 定义的特殊参数
u 仅展开每个唯一单词的第一次出现。
U 将结果中的所有字母转换为大写。
v 用于 k,替换(作为两个连续的单词)键和值
每个关联数组元素。 与下标一起使用,强制值是
即使下标形式引用索引或键,也会被替换。
V 使结果单词中的所有特殊字符可见。
w 通过 ${#姓名},计算数组或字符串中的单词数; 这 s 标志可用于设置
单词分隔符。
W 像 w 不同之处在于重复分隔符之间的空词是
也算了。
X 使用此标志,解析发生的错误 Q, e 和 # 旗帜或图案
匹配形式如`${姓名#模式}” 被报道。 没有标志,错误
被默默无视。
z 使用 shell 解析将扩展结果拆分为单词以查找单词,
即考虑值中的任何引用。 评论不予处理
特别是但作为普通字符串,类似于带有
互动评论 选项未设置(但是,请参阅 Z 下面的标志为相关
选项)
请注意,这是很晚完成的,甚至晚于`()' 旗帜。 所以要访问
结果中的单个单词使用嵌套扩展,如`${${(z)foo}[2]}'。 同样地,
要删除结果单词中的引号,请使用 `${(Q)${(z)foo}}'.
0 将扩展结果拆分为空字节。 这是`的简写附:\0:'.
以下标志(除了 p) 后跟一个或多个参数,如图所示。 任何
字符,或匹配对 `(...)',`{...}',`[...]',或`<...>',可用于
冒号作为分隔符的位置,但请注意,当一个标志采用多个参数时,
每个参数周围必须有一对匹配的分隔符。
p 识别相同的转义序列 打印 任何内置字符串参数
下面描述的跟随此参数的标志。
或者,使用此选项字符串参数可以采用以下形式 $VAR 在其中
如果变量的值被替换。 请注意,此形式是严格的; 这
字符串参数不进行一般参数扩展。
例如,
九月=:
值=a:b:c
打印 ${(ps.$sep.)val}
将变量拆分为 :.
~ 通过以下任何标志插入到扩展中的字符串将被视为
模式。 这适用于后面的标志的字符串参数 ~ 字幕可视电话用于
同一组括号。 与之比较 ~ 括号外,这迫使
整个替换字符串被视为模式。 因此,例如,
[[ “?” = ${(~j.|.)数组} ]]
对待`|' 作为一种模式并且成功当且仅当 $数组 包含字符串`?'
作为一个元素。 这 ~ 可以重复来切换行为; 仅其作用
持续到括号组的末尾。
j:绳子:
使用以下方法将数组的单词连接在一起 绳子 作为分隔符。 请注意,这
发生在字段分割之前 s:绳子: 旗帜或 SH_WORD_SPLIT 选项。
l:表达式::string1::string2:
将生成的单词填充到左侧。 如果需要,每个单词都会被截断
放置在一个字段中 表达式 字宽。
论据 :string1: 和 :string2: 是可选的; 两者都可以、第一个或两者都可以
被给予。 请注意,每个分隔符必须使用相同的分隔符对。
三个论点。 左边的空间将被填充 string1 (串联的
根据需要经常使用)或空格,如果 string1 没有给出。 如果两者都 string1 和 string2
给出, string2 直接在每个单词的左侧插入一次,如果满足则被截断
必要的,之前 string1 用于生成任何剩余的填充。
如果其中任何一个 string1 or string2 存在但为空,即有两个分隔符
此时,第一个字符 $IFS 改为使用。
如果 多字节 选项生效,标志 m 也可以给出,在这种情况下
宽度将用于计算填充; 否则单独的多字节
字符被视为占据一个宽度单位。
如果 多字节 选项无效,字符串中的每个字节都被视为
占用一个单位的宽度。
控制字符始终假定为一单位宽; 这允许
用于生成控制字符重复的机制。
m 仅与其中一个标志一起有用 l or r 或与 # 长度运算符
当 多字节 选项已生效。 使用报告的字符宽度
系统计算它占据了多少字符串或总长度
字符串。 大多数可打印字符的宽度为一个单位,但是某些
亚洲字符集和某些特效使用更宽的字符; 结合
字符的宽度为零。 不可打印的字符被任意算作
零宽度; 它们的实际显示方式会有所不同。
如果 m 被重复,该字符要么计数为零(如果它的宽度为零),要么
一。 对于可打印字符串,这具有计算字符串数量的效果
字形(明显独立的字符),除了组合的情况
字符本身具有非零宽度(在某些字母表中是这样)。
r:表达式::string1::string2:
As l,但在右侧填充单词并插入 string2 立即在右侧
要填充的字符串。
左右填充可以一起使用。 在这种情况下,策略是应用
左填充到每个结果单词的前半宽度,右填充
填充到下半场。 如果要填充的字符串具有奇数宽度,则额外的
填充应用于左侧。
s:绳子:
分离器处的力场分裂 绳子. 请注意,一个 绳子 两个或更多
字符表示所有字符必须按顺序匹配; 这不同于
处理两个或多个字符 IFS的 范围。 另请参阅 = 标志和
此 SH_WORD_SPLIT 选项。 也可以给出一个空字符串,在这种情况下,每个
字符将是一个单独的元素。
由于历史原因,保留空数组元素的通常行为
对于通过分割生成的数组,双引号内被禁用; 因此
在以下:
行=“一::三”
打印 -l “${(s.:.)line}”
产生两行输出 一种 和 三 并删除空白字段。 到
覆盖此行为,提供`(@)' 也有标志,即 “${(@s.:.)line}”.
Z:选择:
As z 但采用以下一对之间的选项字母组合
分隔符。 没有选项的情况下,效果与 z. (Z+c+) 原因
注释被解析为字符串并保留; 结果数组中的任何字段
以未加引号的注释字符开头的是注释。 (Z+C+) 引发评论
被解析和删除。 注释的规则是标准的:a 之间的任何内容
以第三个字符开头的单词 $HISTCHARS, 默认 #,直到下一个
换行符是注释。 (Z+n+) 导致未加引号的换行符被视为普通换行符
空格,否则它们将被视为 shell 代码分隔符并且
转换为分号。 选项在同一组分隔符内组合,
例如 (Z+Cn+).
_:标志:
下划线(_) 标志保留供将来使用。 自 zsh 的本次修订以来,
没有有效的 标志; 下划线后面的任何内容,除了空
分隔符对被视为错误,并且标志本身没有任何作用。
以下标志有意义 ${...#...} or ${...%...} 形式。 这 S 和 I
标志也可以与 ${.../...} 形式。
S 搜索子字符串以及开头或结尾; 和 # 从头开始
和 % 从字符串的末尾开始。 通过替换 ${.../...} or
${...//...},指定非贪婪匹配,即用最短的而不是
最长的匹配应该被替换。
I:表达式:
搜索 表达式第一场比赛(其中 表达式 计算结果为数字)。 这仅适用于当
搜索子字符串,或者使用 S 标志,或与 ${.../...} (只有
表达式第一场比赛被替换)或 ${...//...} (所有比赛来自 表达式都是
取代)。 默认为取第一个匹配项。
这款 表达式计算第 XNUMX 个匹配项,使得每个匹配项中有 XNUMX 个或 XNUMX 个匹配项
字符串中的起始位置,尽管对于全局替换匹配
重叠的先前替换将被忽略。 随着 ${...%...} 和 ${...%%...}
形式,比赛的起始位置从结束位置向后移动
指数增加,而其他形式则从一开始就向前移动。
因此用字符串
这 开关 is 此 右 开关 伊普斯威奇?
形式的替代 ${(SI:N:)字符串#w*ch} as N 从 1 开始增加将匹配
并删除`这',`巫婆',`巫婆'和`至极'; 使用`的形式##' 将匹配并且
删除`这 开关 is 此 右 开关 伊普斯维奇',`巫婆 is 此 右 开关
伊普斯维奇',`巫婆 伊普斯维奇'和`至极'。 形式使用`%' 将删除
与`相同的匹配#',但顺序相反,并且使用 ` 的形式%%' 将删除
与`相同的匹配##' 以相反的顺序。
B 在结果中包含匹配开始的索引。
E 在结果中包含比赛结束的索引。
M 将匹配的部分包含在结果中。
N 在结果中包含匹配的长度。
R 包括结果中不匹配的部分( R美东时间)。
规则
以下是替换规则的摘要; 这假设存在大括号
围绕替换,即 ${...}。 下面给出一些具体的例子。 笔记
Zsh 开发集团接受 没有 责任 对于任何可能的脑损伤
发生在阅读以下规则的过程中。
1. 嵌套 代换
如果多个嵌套 ${...} 形式存在,替换是从
内向外。 在每个级别,替换都会考虑是否
当前值是标量还是数组,无论整个替换是否为 double
引号,以及为当前替换级别提供哪些标志,就像
如果嵌套替换是最外面的。 标志不会传播到
附上替代品; 嵌套替换将返回标量或
由标志确定的数组,可能会根据引用进行调整。 以下全部
在适用的情况下,在所有替代级别上都采取步骤。 请注意,除非
`(P)' 存在标志,标志和任何下标直接应用于该值
嵌套替换; 例如,扩展 ${${foo}} 行为完全
相同 ${foo}.
在每个嵌套的替换级别,被替换的单词都会经历各种形式的
单字替换(即不生成文件名),包括命令
替换、算术扩展和文件名扩展(即前导 ~ 和 =).
因此,例如, ${${:-=猫}:h} 展开到目录 猫 程序
居住。 (说明:内部替换没有参数,但有一个默认值
折扣值 =猫,通过文件名扩展为完整路径来扩展;外层
替换然后应用修饰符 :h 并获取目录部分
小路。)
2. 内部 参数 标志
由其中之一设置的任何参数标志 排版 命令族,特别是
L, R, Z, u 和 l 填充和大写标志直接应用于
参数值。请注意,这些标志是命令的选项,例如`排版 -Z';
它们与参数替换中使用的标志不同。
3. 产品型号 下标
如果该值是带有下标的原始参数引用,例如 ${VAR[3]},
下标的效果直接应用于参数。下标是
从左到右评估;后续下标适用于标量或数组值
由前一个下标产生。因此如果 VAR 是一个数组, ${var[1][2]} 是
第一个单词的第二个字符,但是 ${var[2,4][2]} 是整个第三个词
(原始数组的第二个到第四个单词范围的第二个单词)。
可以出现任意数量的下标。标志如 (k)的 和 (五) 这改变了
应用下标的结果。
4. 产品型号 姓名 替代
任意的效果 (P) flag,将值视为参数名称,并且
将其替换为相应的值,然后应用。
5. 双引号 加盟
如果此处理后的值是一个数组,并且替换出现在 double 中
引用,并且都不是 (@) 标志也不是 # 当前存在长度运算符
level,然后将值的单词与参数的第一个字符连接起来
$IFS,默认情况下每个单词之间有一个空格(单个单词数组不被修改)。
如果 (j)的 存在标志,用于加入而不是 $IFS.
6. 嵌套 下标
任何剩余的下标(即嵌套替换的)都在此评估
点,基于该值是数组还是标量。与 3., 多
可以出现下标。注意 ${foo[2,4][2]} 因此相当于
${${foo[2,4]}[2]} 还有 “${${(@)foo[2,4]}[2]}” (嵌套替换
在两种情况下都返回一个数组),但不是 “${${foo[2,4]}[2]}” (嵌套的
由于引号,替换返回一个标量)。
7. 修饰符
任何修饰符,由尾随 ` 指定#',`%',`/' (可能加倍)或通过
形式的修饰符集 :... (参见“修饰符”部分)
“历史扩展”),应用于该级别的值的单词。
8. 字符 评估
不限 (#) 应用标志,以数字形式评估迄今为止的结果作为字符。
9. 长度
任意首字母 # 修饰符,即形式 ${#VAR},用于评估长度
到目前为止的表达。
10. 强 加盟
如果`(j)的' 标志存在,或者没有 `(j)的' 标志存在,但字符串是
按照规则分割 11.,并且加入没有发生在步骤 5., 中的任何单词
使用给定的字符串或第一个字符将值连接在一起 $IFS
如果没有。请注意`(六)' 标志隐式提供一个用于加入此的字符串
方式。
11. 简易 字 分裂
如果其中之一`()' 或`(六)' 标志存在,或者 `=' 说明符存在
(例如 ${=VAR}),单词在出现指定字符串时被分割,或者(对于 =
两个标志都不存在)中的任何字符 $IFS.
如果没有`()',`(六)' 或`=' 已给出,但该词未被引用并且选项
SH_WORD_SPLIT 设置后,单词会在出现中的任何字符时被分割
$IFS。请注意,此步骤也发生在嵌套替换的所有级别。
12. 案例 修改
来自标志之一的任何大小写修改 (L)的, (U) or (C) 被应用。
13. 逃生 序列 替代
首先,任何替代品来自 (克) 执行标志,然后任何提示样式
格式化从 (%) 应用标志系列。
14. 引用 应用的区域
任何引用或取消引用使用 (q) 和 (问) 并应用相关标志。
15. 目录 命名
任何目录名称替换使用 (D) 应用标志。
16. 提升品牌曝光性 增强
使用使字符可见的任何修改 (五) 应用标志。
17. 词法 字 分裂
如果'(z)' 标志或 ' 的形式之一(Z)' 标志存在,单词是
像 shell 命令行一样分割,以便引号和其他
元字符用于决定单词的构成。注意这种形式
分裂与规则描述的完全不同 11.: 没有使用
$IFS,并且不会造成强制加入。
18. 唯一
如果结果是一个数组并且`(u)' 存在标志,重复元素
从数组中删除。
19. 订购
如果结果仍然是一个数组和`之一(o)' 或`(O)' 旗帜出现了,
数组被重新排序。
20. RC_EXPAND_PARAM
此时决定是否要添加任何结果数组元素
逐个元素与周围文本组合,如以下任一所示
RC_EXPAND_PARAM 选项或`^' 旗帜。
21. 重新评估
任何`(五)' 标志应用于该值,强制重新检查新值
参数替换,还可以用于命令和算术替换。
22. 填充
值的任何填充(湖。填.)' 或`(河。填.)' 标志被应用。
23. 语义 加盟
在扩展语义需要单个单词才能产生结果的上下文中,所有单词
与第一个字符重新连接 IFS的 之间。所以在`${(P)${(f)行}}'
的值 ${行} 在换行符处拆分,但必须在之前再次连接
此 P 可以应用标志。
如果不需要单个单词,则跳过此规则。
24. 空的 论点 切除
如果替换未出现在双引号中,则任何生成的零长度
参数,无论是来自标量还是数组的元素,都会从列表中删除
插入命令行的参数。
严格来说,删除会在稍后发生,就像其他形式一样
替代;这里要注意的一点是它发生在任何一个之后
以上参数操作。
例子
旗 f 对于逐行分割双引号替换非常有用。例如,
${(f)"$(文件)"} 替换的内容 文件 划分使得每一行都是一个元素
结果数组的。与此效果进行比较 $(文件) 单独,它划分了
按单词归档,或者同样用双引号括起来,这使得整个内容
文件单个字符串。
下面说明了嵌套参数扩展的规则。假设 $ foo
包含数组 (酒吧 巴兹):
“${(@)${foo}[1]}”
这会产生结果 b。一、内替代 “${foo}”,没有
数组(@) 标志,产生单个单词结果 “酒吧 巴兹”。外部替代
“${(@)...[1]}” 检测到这是一个标量,因此(尽管 `(@)' 标志)
下标选取第一个字符。
“${${(@)foo}[1]}”
这会产生结果`酒吧'。在这种情况下,内部替换 “${(@)foo}”
产生数组`(酒吧 巴兹)'。外部替代 “${...[1]}” 检测到
这是一个数组并选择第一个单词。这类似于简单的情况
“${foo[1]}”.
作为分词和连接规则的示例,假设 $ foo 包含数组
`(轴1 bx1)'。然后
${(s/x/)foo}
产生单词`a',`1 b'和`1'.
${(j/x/s/x/)foo}
产生`a',`1',`b'和`1'.
${(s/x/)foo%%1*}
产生`a'和` b'(注意多余的空格)。由于替换发生在任一之前
连接或分裂,操作首先生成修改后的数组 (斧头 乙),
加入以给予 “斧头 乙x”,然后拆分为`a',` b'和''。这
最终的空字符串将被删除,因为它不在双引号中。
指挥 代换
括在括号中的命令,前面带有美元符号,例如 `$(...)',或引用
重音,例如“`...`', 被其标准输出替换,并带有任何尾随
换行符已删除。如果替换未用双引号括起来,则输出为
使用 IFS的 范围。替换`$(猫 FOO)' 可以被替换
通过等效但更快的`$(FOO)'。无论哪种情况,如果选项 GLOB_SUBST 设置,
输出适合文件名生成。
算术 扩张
形式为`的字符串$[EXP]' 或`$((EXP))' 被替换为
算术表达式 EXP. EXP 遭受 参数 扩张, 命令 代换
和 算术 扩张 在评估之前。请参阅“算术评估”部分。
支撑 扩张
形式为`的字符串FOO{xx,yy,zz}酒吧' 扩展为单个单词 `fooxxbar',
`富伊巴尔'和`foozzbar'。保留从左到右的顺序。这个构造可能是
嵌套的。可以引用逗号,以便将它们按字面意思包含在单词中。
形式的表达式 `{n1..n2}', 在哪里 n1 和 n2 是整数,扩展到每个
之间的数字 n1 和 n2 包括的。如果任一数字以零开头,则所有
结果数字将用前导零填充到最小宽度,但对于
负数 - 字符也包含在宽度中。如果数字在
降序 生成的序列也将按降序排列。
形式的表达式 `{n1..n2..n3}', 在哪里 n1, n2及 n3 是整数,被展开
如上所述,但只有每个 n3第一个数字从 n1 是输出。如果 n3 是负数
数字以相反的顺序输出,这与简单交换略有不同 n1
和 n2 在该步骤的情况下 n3 没有均匀地划分范围。零填充可以是
在三个数字中的任何一个中指定,在第三个数字中指定它可以用于填充
例子`{-99..100..01}' 不可能通过在其中任何一个上放置 0 来指定
前两个数字(即填充两个字符)。
形式的表达式 `{c1..c2}', 在哪里 c1 和 c2 是单个字符(可能是
多字节字符),扩展到范围内的每个字符 c1 至 c2 in
无论内部使用什么字符序列。对于码位低于 128 的字符
这是 US ASCII(这是大多数用户需要的唯一情况)。如果有任何介入
字符不可打印,使用适当的引用使其可打印。如果
字符序列颠倒,输出顺序相反,例如`{d..a}' 是
替换为`d c b a'.
如果大括号表达式不匹配上述任何形式,则它保持不变,除非
选项 支架_CCL (“大括号字符类”的缩写)已设置。在这种情况下,它
扩展为大括号之间的各个字符的列表,排序为
ASCII 字符集中字符的顺序(当前不支持多字节字符)
处理)。语法类似于 [...] 文件名生成中的表达式:`-' 是
经特殊处理以表示一系列字符,但是 `^' 或`!' 作为第一个字符
被正常对待。例如,`{abcdef0-9}' 扩展到 16 个单词 0 1 2 3 4 5 6 7 8 9 a
b c d e f.
请注意,大括号扩展不是文件名生成(通配)的一部分;一种表达
如 */{foo,酒吧} 被分成两个单独的词 */富 和 */酒吧 文件名之前
一代发生。特别要注意的是,这可能会产生“不匹配”
错误如果 或 两个表达式的不匹配;这是与
*/(富|酒吧),它被视为单个模式,但在其他方面具有类似的效果。
要将大括号扩展与数组扩展结合起来,请参阅 ${^规格} 中描述的形式
上面的参数扩展部分。
文件名 扩张
检查每个单词是否以不带引号的 ` 开头~'。如果是的话,那么这个词
最多一个`/',或者如果没有 ' 则为单词结尾/',检查是否可以
以此处描述的方式之一替换。如果是这样,那么`~' 和检查的
部分被替换为适当的替代值。
一个`~' 本身被替换为 $ HOME。一个`~' 后面跟着一个 '+' 或一个 `-' 是
分别替换为当前或以前的工作目录。
一个`~' 后跟的数字将替换为目录中该位置的目录
堆。 `~0' 等价于 `~+',和`~1' 是堆栈的顶部。 `~+' 后面跟着一个
number 被目录堆栈中该位置的目录替换。 `〜+ 0' 是
相当于`~+',和`〜+ 1' 是堆栈的顶部。 `~-' 后面跟着一个数字是
替换为距堆栈底部许多位置的目录。 `〜-0' 是
堆栈的底部。这 PUSHD_MINUS 选项交换`的效果~+'和`~-' 在哪里
它们后面跟着一个数字。
动态 命名 目录
如果函数 zsh_目录名 存在,或者 shell 变量
zsh_目录名称_函数 存在并包含一个函数名称数组,那么
函数用于实现动态目录命名。这些功能在中进行了尝试
顺序直到一个返回状态零,因此函数测试它们是否
可以处理相关案例并返回适当的状态。
一个`~' 后跟一个字符串 南斯特尔 未加引号的方括号中被特殊视为
动态目录名称。请注意,第一个不带引号的右方括号始终
终止 南斯特尔。 shell 函数传递两个参数:字符串 n (用于名称)
和 南斯特尔。它应该设置数组 一个回复 到单个元素,即
与名称相对应的目录并返回状态零(执行分配作为
最后一条语句通常就足够了),否则它应该返回非零状态。在前者中
如果将回复元素用作目录;在后一种情况下,替换是
视为失败。如果所有功能都失败并且该选项 不匹配 已设置,出现错误
结果。
上面定义的函数还用于查看是否可以将目录变成目录
名称,例如打印目录堆栈或扩展时 %~ 在提示中。在
在这种情况下,每个函数都会传递两个参数:字符串 d (对于目录)和
动态命名的候选者。该函数应该返回非零状态,如果
目录不能由函数命名,或者应该将数组回复设置为包含
两个元素:第一个是目录的动态名称(如出现在
`~[...]'),第二个是要替换的目录的前缀长度。为了
例如,如果试用目录是 /home/我的名字/src/zsh 以及动态名称
/home/我的名字/src (有 16 个字符)是 s,则函数集
回复=(s 16)
将如此返回的目录名称与部分可能的静态名称进行比较
目录路径,如下所述;如果前缀长度匹配(16 中的),则使用它
例如)比任何静态名称匹配的长度都要长。
不要求函数同时实现这两个功能 n 和 d 来电;例如,它
可能适合某些不收缩为名称的动态扩展形式。
在这种情况下,任何带有第一个参数的调用 d 应该导致非零状态
回。
完成系统调用`zsh_目录名 c' 随后是对等价的调用
数组的元素 zsh_目录名称_函数,如果存在,为了完成
目录的动态名称。此代码应与任何其他完成代码相同
功能如所述 中山康普系统(1)。
作为一个工作示例,下面是一个函数,它扩展以
绳子 p: 到下面的目录 /home/pws/perforce。在这个简单的例子中,静态名称为
该目录同样有效。
zsh_目录名() {
仿真 -L zsh的
设置选项 扩展全局
本地 -a 匹配 开始 修补
if [[ $1 = d ]]; 然后
# 转 此 目录 成 a 姓名
if [[ $2 = (#b)(/home/pws/perforce/)([^/]##)* ]]; 然后
排版 到 一个回复
回复=(p:$match[2] $(( ${#match[1]} + ${#match[2]} )) )
其他
回报 1
fi
ELIF [[ $1 = n ]]; 然后
# 转 此 姓名 成 a 目录
[[ $2 != (#b)p:(?*) ]] && 回报 1
排版 到 一个回复
回复=(/home/pws/perforce/$match[1])
ELIF [[ $1 = c ]]; 然后
# 完成 名称
本地 EXPL
本地 -a 迪尔斯
目录=(/home/pws/perforce/*(/:t))
目录=(p:${^目录})
_通缉 动态目录 EXPL '动态的 目录' 组合 -S\] -a 迪尔斯
回报
其他
回报 1
fi
回报 0
}
静止 命名 目录
一个`~' 后面是任何尚未涵盖的内容,由任意数量的字母数字组成
字符或下划线(`_'), 连字符 (`-'), 或点 (`.') 被查找为命名的
目录,并替换为该指定目录的值(如果找到)。命名目录
通常是系统上用户的主目录。它们也可以被定义,如果
` 之后的文本~' 是一个字符串 shell 参数的名称,其值以 ` 开头/'.
请注意,尾部斜杠将从目录路径中删除(尽管
原参数不变)。
也可以使用以下命令定义目录名称 -d 选项 哈希 内置。
当 shell 打印路径时(例如,当展开时 %~ 在提示中或打印时
目录堆栈),检查路径以查看它是否具有命名目录作为其前缀。
如果是这样,则前缀部分将替换为 `~' 后面是名称
目录。使用两种引用目录的方式中较短的一种,即
目录名称或完整路径;如果它们的长度相同,则使用该名称。这
参数 $密码 和 $OLDPWD 永远不会以这种方式缩写。
`=' 扩张
如果一个单词以不带引号的 ` 开头=' 和 等于 设置选项后,其余的
word 被视为命令的名称。如果存在具有该名称的命令,则该单词为
替换为命令的完整路径名。
笔记
文件名扩展在参数分配的右侧执行,
包括那些出现在命令之后的 排版 家庭。在这种情况下,正确的
手边将被视为以冒号分隔的列表,方式如下 PATH 参数,
这样一个`~' 或一个 `=' 跟随一个 ':' 有资格进行扩展。所有此类行为都可以
通过引用`来禁用~',`=',或整个表达式(但不仅仅是
冒号);这 等于 选择权也受到尊重。
如果是选项 MAGIC_EQUAL_SUBST 设置后,任何未加引号的 shell 参数的形式
`识别码=表达' 符合前面所述的文件扩展资格
段落。引用第一个`='也抑制了这一点。
文件名 代
如果一个单词包含字符之一的未加引号的实例 `*',`(',`|',`<',`[',
或`?',它被视为文件名生成的模式,除非 格劳博 选项是
未设置。如果 EXTENDED_GLOB 设置选项后,`^'和`#' 字符也表示
图案;否则,它们不会受到外壳的特殊处理。
该单词将替换为与模式匹配的已排序文件名列表。如果不
找到匹配的模式,shell 会给出错误消息,除非 NULL_GLOB 选项
已设置,在这种情况下该单词将被删除;或者除非 不匹配 选项未设置,其中
如果该词保持不变。
在文件名生成中,字符`/' 必须显式匹配;另外,一个`.' 必须是
在模式的开头或 ` 之后显式匹配/',除非 GLOB_DOTS
选项已设置。没有文件名生成模式与文件`匹配.' 或`..'。其他
模式匹配的实例,`/'和`.' 没有受到特殊对待。
水珠 运营商
* 匹配任何字符串,包括空字符串。
? 匹配任何字符。
[...] 匹配任何包含的字符。字符范围可以通过以下方式指定
用 ` 分隔两个字符-'。一个`-' 或`]' 可以通过将其包含为来匹配
列表中的第一个字符。还有几个命名类
字符,格式为 `[:姓名:]' 具有以下含义。第一组使用
操作系统提供的宏来测试给定的字符
组合,包括由于本地语言设置而进行的任何修改,请参阅
CTYPE(3):
[:铝:]
该字符是字母数字
[:α:]
该字符是字母
[:ascii:]
该字符为 7 位,即没有最高位的单字节字符
设置。
[:空白的:]
字符是空格或制表符
[:控制:]
该字符是控制字符
[:数字:]
该字符是十进制数字
[:图形:]
该字符是除空格之外的可打印字符
[:降低:]
该字符是小写字母
[:打印:]
该字符是可打印的
[:点:]
该字符是可打印的,但既不是字母数字也不是空格
[:空间:]
该字符为空格
[:上:]
该字符是大写字母
[:x数字:]
该字符是一个十六进制数字
另一组命名类由 shell 在内部处理,而不是
对区域设置敏感:
[:身份:]
该字符可以构成 shell 标识符的一部分,例如
参数名称
[:IFS:]
该字符用作输入字段分隔符,即包含在
IFS的 参数
[:IFS空间:]
该字符是 IFS 空白字符;请参阅文档 IFS的
,在 参数(1) 手册页。
[:不完整:]
匹配以不完整的多字节字符开头的字节。注意
可能有一个以上字节的序列,它们一起形成
多字节字符的前缀。测试可能不完整的字节
序列,使用模式`[[:不完整:]]*'。这永远不会匹配
以有效多字节字符开头的序列。
[:无效的:]
匹配不以有效多字节字符开头的字节。注意这一点
可以是不完整多字节字符的任何部分的连续字节
由无效和不完整的多字节组成的多字节字符串
字符被视为单个字节。
[:单词:]
该字符被视为单词的一部分;该测试对
的价值 字字符 参数
请注意,方括号是对包含整组方括号的补充。
字符,因此要测试单个字母数字字符,您需要`[[:alnum:]]'.
命名字符集可以与其他类型一起使用,例如`[[:阿尔法:]0-9]'.
[^...]
[!...] 喜欢 [...],但它匹配不属于给定集合的任何字符。
<[x]-[y]>
匹配范围内的任意数字 x 至 y, 包括的。任一数字都可以是
省略使范围成为开放式;因此`<->' 匹配任何数字。匹配
个别数字, [...] 形式更加高效。
在这种形式的模式旁边使用其他通配符时要小心;为了
例, * 实际上会匹配开头的任何数字
字符串,因为`<0-9>' 将匹配第一个数字,而 `*' 将匹配任何
其他的。这是粗心者的陷阱,但实际上是不可避免的结果
最长可能匹配总是成功的规则。表达式如
`[^[:数字:]]*' 可以代替使用。
(...) 与封闭的图案相匹配。这用于分组。如果 KSH_GLOB 选项
被设置,然后一个`@',`*',`+',`?' 或`!' 紧接在 `(' 被治疗
特别是,如下详述。选项 SH_GLOB 防止出现裸括号
以这种方式使用,虽然 KSH_GLOB 选项仍然可用。
请注意,分组不能扩展到多个目录:这是一个错误
一个`/' 在一个组内(这仅适用于文件名生成中使用的模式)。
有一个例外:一组形式 (拍/)# 显示为完整路径
段可以匹配一系列目录。例如, foo/(a*/)#bar 火柴
富/酒吧, foo/任何/酒吧, foo/任何/任何其他/酒吧,等等。
x|y 匹配任一 x or y。该运算符的优先级低于任何其他运算符。的`|'
字符必须位于括号内,以避免解释为管道。
^x (要求 EXTENDED_GLOB 待设置。)匹配除模式之外的任何内容 x。 这
优先级高于`/',所以`^富/酒吧' 将搜索 ` 中的目录.'
除了`./富' 对于名为 ' 的文件酒吧'.
x~y (要求 EXTENDED_GLOB 待设置。)匹配任何与模式匹配的内容 x 但是
不匹配 y。它的优先级低于除 ` 之外的任何运算符|', 所以
`*/*~foo/酒吧' 将搜索 ` 中所有目录中的所有文件.'然后排除
`富/酒吧'如果有这样的比赛的话。可以通过以下方式排除多个模式
`FOO~酒吧~巴兹'。在排除模式中(y),`/'和`.' 没有受到特殊对待
他们通常的通配方式。
x# (要求 EXTENDED_GLOB 待设置。)匹配零次或多次出现的
模式 x。该运算符具有高优先级; `12#' 等价于 `1(2#)',
而不是`(12)#'。对于未加引号的 ` 来说这是一个错误#' 遵循某事
不能重复;这包括一个空字符串,一个已经跟随的模式
`##',或括号作为 KSH_GLOB 模式(例如,`!(FOO)#' 是
无效,必须替换为 `*(!(FOO))“)。
x## (要求 EXTENDED_GLOB 待设置。)匹配该模式的一次或多次出现
x。该运算符具有高优先级; `12 ##' 等价于 `1(2##)', 相当
比`(12)##'。不超过两个活跃`#' 字符可能会一起出现。 (笔记
与形式为`的全局限定符的潜在冲突1(2##)' 这应该
因此应避免。)
类ksh 水珠 运营商
如果 KSH_GLOB 设置选项后,括号的效果可以通过前面的修改
`@',`*',`+',`?' 或`!'。该字符无需取消引号即可具有特殊效果,
但`(' 必须是。
@(...) 匹配括号中的模式。 (就像`(...)'.)
*(...) 匹配任意次数的出现。 (就像`(...)#',除了递归目录
不支持搜索。)
+(...) 至少匹配一次。 (就像`(...)##',除了递归目录
不支持搜索。)
?(...) 匹配零次或一次出现。 (就像`(|...)'.)
!(...) 匹配除括号中的表达式之外的任何内容。 (就像`(^(...))'.)
优先权
上面给出的运算符的优先级是(最高)`^',`/',`~',`|'(最低);这
其余运算符只是从左到右视为字符串的一部分,其中包含 `#'
和`##' 适用于最短的可能前面的单元(即一个字符,`?',`[...]',
`<...>',或括号内的表达式)。如上所述,一个`/' 用作目录
分隔符不能出现在括号内,而 `|' 必须这样做;在使用的模式中
除了文件名生成之外的其他上下文(例如,在 案件 内的语句和测试
`[[...]]'), 一个`/' 并不特殊;和`/' 在 ` 之后也不特殊~' 出现
文件名模式中的括号外。
乱七八糟 旗
有多种标志会影响其右侧直到文本末尾的任何文本
封闭组或到模式的末尾;他们需要 EXTENDED_GLOB 选项。全部
采取形式 (#X) 哪里 X 可能有以下形式之一:
i 不区分大小写:模式中的大写或小写字符匹配大写或
小写字符。
l 模式中的小写字符与大写或小写字符匹配;上
模式中的大小写字符仍然只匹配大写字符。
I 区分大小写:局部否定效果 i or l 从那时起。
b 激活模式中括号组的反向引用;这不起作用
在文件名生成中。当带有一组活动括号的模式是
匹配,组匹配到的字符串存储在数组中 $匹配,
数组中匹配括号开头的索引 $m开始,并
数组末尾的索引 $修补,每个数组的第一个元素
对应于第一个括号组,依此类推。这些数组不是
否则对外壳来说是特殊的。索引使用与以下相同的约定
参数替换,使得元素 $修补 和 $m开始 可用于
下标;这 KSH_数组 选择权受到尊重。通配标志集不是
考虑括号内的组;仅前九个有效括号可以
参考。
例如,
富=“一个 绳子 - a 消息“
if [[ $ foo = (一个|一个)' '(#b)(*)' '* ]]; 然后
打印 ${foo[$mbegin[1],$mend[1]]}
fi
打印`绳子 - a'。请注意,第一个括号位于 (#b) 和
不创建反向引用。
反向引用适用于除文件名之外的所有形式的模式匹配
生成,但请注意,当对整个数组执行匹配时,例如
${排列#模式},或全局替换,例如 ${停止//拍/代表}, 只有
最后一场比赛的数据仍然可用。在全局替换的情况下
可能仍然有用。请参阅示例 m 下面的标志。
反向引用的编号严格遵循开头的顺序
模式字符串中的括号从左到右,尽管括号组
可能是嵌套的。对于后面跟着`的括号有特殊的规则#' 或`##'.
仅记住括号的最后一个匹配:例如,在 `[[ 阿巴布 =
(#b)([ab])# ]]',只有最后的'b' 存储在 比赛[1]。因此额外的括号
可能需要匹配完整的段:例如,使用 `X((ab|cd)#)Y' 至
匹配整个字符串`ab' 或`cd' 之间 'X'和`Y',使用的值
$匹配[1] 而非 $匹配[2].
如果匹配失败,则不会更改任何参数,因此在某些情况下可能会
需要事先初始化它们。如果某些反向引用失败
匹配——如果它们位于无法匹配的备用分支中,则会发生这种情况,或者
如果他们后面跟着 # 并匹配零次——然后设置匹配的字符串
为空字符串,并将开始和结束索引设置为 -1。
使用反向引用的模式匹配比不使用反向引用的模式匹配稍慢。
B 停用反向引用,消除反向引用的影响 b 从那时起标记。
cN,M 旗 (#CN,M) 可以在任何地方使用 # or ## 可以使用运算符,除了
在表达式`(*/)#'和`(*/)##' 在文件名生成中,其中 `/' 有
特殊意义;它不能与其他通配标志和错误模式结合使用
如果放错地方就会出现错误。它相当于以下形式 {N,M} 定期地
表达式。前一个字符或组需要在之间匹配 N 和 M
次,包容。表格 (#CN) 准确地要求 N 火柴; (#C,M) 是等价的
指定 N 为 0; (#CN,) 指定数量没有最大限制
的比赛。
m 设置对整个匹配字符串的匹配数据的引用;这类似于
反向引用并且在文件名生成中不起作用。该标志必须位于
效果在模式的末尾,即不是组的局部效果。参数 $匹配,
$MBEGIN 和 $修正 将被设置为匹配的字符串和索引
分别是字符串的开头和结尾。这在参数中最有用
替换,否则匹配的字符串是显而易见的。
例如,
arr=(费尔德特 yn 格林普斯 教产 赵 降压)
打印 ${arr//(#m)[aeiou]/${(U)MATCH}}
强制所有匹配项(即所有元音)变为大写,打印 `维尔特 yn
格兰普斯 瓦夫 zhO 巴克'.
与反向引用不同,使用匹配引用不会造成速度损失,其他
比在以下情况下替换字符串所需的额外替换要多:
所示的示例。
M 停用 m 标志,因此不会创建对匹配数据的引用。
aNUM 近似匹配: NUM 模式匹配的字符串中允许有错误。
下一小节将描述相关规则。
s, e 与其他标志不同,这些标志仅具有局部效果,并且每个标志都必须出现在其
拥有:`(#s)'和`(#e)' 是唯一有效的形式。的`(#s)' 标志仅在以下时间成功
测试字符串的开头,以及`(#e)' 标志仅在末尾成功
测试字符串;它们对应于`^'和`$' 在标准正则表达式中。他们
对于匹配除文件名之外的模式中的路径段很有用
生成(其中路径段在任何情况下都是单独处理的)。例如,
`*((#s)|/)测试((#e)|/)*' 匹配路径段 `test' 在以下任一情况下
字符串: test, 测试/开始/开始, 在/结束/测试时, 在/测试/中间.
另一个用途是参数替换;例如`${数组/(#s)A*Z(#e)}' 将要
仅删除数组中与完整模式匹配的元素`A*Z'。 有
执行许多此类操作的其他方式,但是组合
替换操作`/'和`//' 与 '(#s)'和`(#e)' 标志提供
一个简单而难忘的方法。
请注意,断言的形式为`(^(#s))' 也有效,即匹配除 at 之外的任何地方
字符串的开头,尽管这实际上意味着“除了 a 之外的任何内容”
字符串开头的零长度部分';你需要使用`(“”~(#s))' 至
匹配字符串中不在开头的零长度部分。
q 一个`q' 并且直到 globbing 标志的右括号为止的所有内容都是
被模式匹配代码忽略。这是为了支持 glob 的使用
预选赛,见下文。结果是模式`(#b)(*).c(#q.)' 可以使用
既用于通配符又用于匹配字符串。在前一种情况下,
`(#q。)' 将被视为全局限定符,而 `(#b)' 将没有用处,
而在后一种情况下`(#b)' 对于反向引用很有用,而 `(#q。)'
将被忽略。请注意,glob 限定符中的冒号修饰符也不是
应用于普通模式匹配。
u 在确定多字节字符的存在时,请考虑当前区域设置
模式,前提是 shell 是用 多字节支持。这会覆盖
此 多字节 选项;默认行为取自该选项。比较 U.
(助记:通常多字节字符来自 UTF-8 编码中的 Unicode,
尽管可以使用系统库支持的任何 ASCII 扩展。)
U 所有字符都被视为单个字节长。相反的是 u。 这
覆盖 多字节 选项。
例如,测试字符串 福克斯 可以通过图案来搭配 (#i)FOOXX,但不是由
(#l)FOOXX, (#i)FOO(#I)XX or ((#i)FOOX)X. 字符串 (#ia2)自述文件 指定
不区分大小写的匹配 自述 最多有两个错误。
使用 ksh 语法对两者进行分组时 KSH_GLOB 和 EXTENDED_GLOB 必须设置并且
左括号前面应该是 @。另请注意,标志不会影响字母
内 [...] 团体,换句话说 (#i)[az] 仍然只匹配小写字母。
最后,请注意,在不区分大小写地检查整个路径时,每个目录都必须是
搜索所有匹配的文件,以便形成以下形式的模式 (#i)/foo/酒吧/... is
可能很慢。
近似 匹配
当近似匹配时,shell 会保留发现的错误的计数,这不能
超过规定的数量 (#ANUM) 旗帜。识别出四种类型的错误:
1. 不同的字符,如 福克斯吧 和 fooybar.
2. 字符的换位,如 香蕉 和 阿布纳纳.
3. 目标字符串中缺少一个字符,如模式所示 路 和目标
绳子 竿.
4. 目标字符串中出现额外的字符,如 炉 和 奋斗.
因此,该模式 (#a3)abcd 火柴 DCBA,使用第一个时发生错误
规则两次,第二个规则一次,将字符串分组为 [d][cb][a] 和 [A B C D].
模式的非文字部分必须完全匹配,包括字符中的字符
范围:因此 (#a1)??? 通过将规则 4 应用于空来匹配长度为 XNUMX 的字符串
模式的一部分,但不是长度为二的字符串,因为所有 ? 必须匹配。其他
必须完全匹配的字符是文件名中的初始点(除非 GLOB_DOTS
设置选项),以及文件名中的所有斜杠,以便 甲/乙 是两个错误 AB/C (
斜杠不能与其他字符互换)。同样,错误也被计算在内
分别针对模式中的非连续字符串,以便 (ab|cd)ef 是两个错误
埃布夫.
当通过排除使用 ~ 运算符,完全处理近似匹配
对于排除的部分,必须单独激活。因此,
(#a1)自述文件~READ_ME 火柴 自述文件 但不 读我,作为尾随 读我 匹配
没有近似。然而, (#a1)README~(#a1)READ_ME 不匹配任何模式
表格 读?ME 因为所有此类形式现在均被排除在外。
除了排除之外,总体错误计数只有一项;然而,最大误差
allowed 可以在本地更改,并且可以通过分组来分隔。例如,
(#a1)猫((#a0)狗)狐狸 总共允许一个错误,这可能不会发生在 狗 部分,
和图案 (#a1)猫(#a0)狗(#a1)狐狸 是等价的。请注意,此时
首先发现误差是确定是否使用近似的关键;为了
例, (#a1)abc(#a0)xyz 不会匹配 abcdxyz,因为错误发生在`x',
其中近似被关闭。
整个路径段可以近似匹配,以便
`(#a1)/foo/d/is/available/at/the/bar' 允许任何路径段中出现一个错误。这个就很多了
效率低于没有 (#a1)但是,由于路径中的每个目录都必须是
扫描可能的近似匹配。最好将 (#a1) 在任何路径之后
已知正确的片段。
递归 乱七八糟
形式为`的路径名组件(FOO/)#' 匹配由零个或多个组成的路径
与模式匹配的目录 FOO.
作为简写,`** /' 等价于 `(*/)#';请注意,这因此匹配文件
当前目录以及子目录。因此:
ls (*/)#酒吧
or
ls **/酒吧
递归目录搜索名为`的文件酒吧'(可能包括文件
`酒吧' 在当前目录中)。此表单不遵循符号链接;这
替代形式`*** /' 确实如此,但在其他方面是相同的。这些都不能
与同一路径段内的其他形式的通配符相结合;在这种情况下,`*'
操作符恢复到通常的效果。
水珠 资格赛
用于文件名生成的模式可能以包含在中的限定符列表结尾
括号。限定符指定哪些文件名与给定的文件名相匹配
模式将被插入到参数列表中。
如果是选项 BARE_GLOB_QUAL 设置后,则尾随一组不包含 ` 的括号|'
或`(' 字符(或 `~' 如果它是特殊的)被视为一组全局限定符。一团
通常被视为 glob 限定符的子表达式,例如 `(^x)', 可
在本例中,通过加倍括号强制将其视为全局模式的一部分
生产`((^x))'.
如果是选项 EXTENDED_GLOB 设置后,可以使用不同的 glob 限定符语法,
即`(#qx)' 在哪里 x 是其他格式中使用的任何相同的 glob 限定符。这
限定符仍必须出现在模式的末尾。但是,使用这种语法
多个 glob 限定符可以链接在一起。它们被视为逻辑与
单独的标志集。此外,由于语法明确,表达式将是
只要其中包含的任何括号都是平衡的,就被视为全局限定符;
的出现`|',`(' 或`~' 并不否定该效果。请注意,预选赛将是
即使模式末尾存在裸露的 glob 限定符,也能以这种形式识别,
例如`*(#q*)(.)' 如果设置了两个选项,将识别可执行的常规文件;
然而,为了清晰起见,应该避免使用混合语法。注意
在使用`的条件下[[' 形成括号表达式的存在 (#q...)
位于字符串末尾表示应执行通配符;该表达式可以
包括 glob 限定符,但如果它只是简单的,它也是有效的 (#q)。这不适用
到模式匹配运算符的右侧,因为语法已经具有特殊的
意义。
限定符可以是以下任意一项:
/ 目录
F “完整”(即非空)目录。注意相反的意思 (^F) 扩展到
空目录和所有非目录。使用 (/^F) 对于空目录。
. 普通文件
@ 符号链接
= 插座
p 命名管道 (FIFO)
* 可执行纯文件(0100 或 0010 或 0001)
% 设备文件(字符或块特殊)
%b 阻止特殊文件
%c 字符特殊文件
r 所有者可读文件 (0400)
w 所有者可写文件 (0200)
x 所有者可执行文件 (0100)
A 组可读文件 (0040)
I 组可写文件 (0020)
E 组可执行文件 (0010)
R 世界可读的文件 (0004)
W 世界可写文件 (0002)
X 世界可执行文件 (0001)
s setuid 文件 (04000)
S setgid 文件 (02000)
t 带有粘滞位的文件 (01000)
f规格 访问权限匹配的文件 规格。 这 规格 可以是八进制数(可选)
前面有一个`=',一个`+',或一个`-'。如果没有给出这些字符,则
行为与`相同='。八进制数描述了模式位
预期,如果与 ` 结合使用=',给定的值必须与文件模式匹配
确切地说,带有`+',至少给定数字中的位必须设置在
文件模式,并带有`-',不得设置数字中的位。给予`?'
而不是数字中任何位置的八进制数字,确保相应的位
在文件模式中未检查,这仅与`组合有用='.
如果限定符`f' 后跟任何其他字符,直到下一个
匹配字符 (`[',`{',和`<' 匹配 `]',`}',和`>' 分别为任意
其他字符与自身匹配)被视为逗号分隔的列表 子规格s.
每 子规格 可以是如上所述的八进制数或任何以下的列表
字符`u',`g',`o',和`a',后面跟着一个`=',一个`+',或一个`-',随后
通过任何字符的列表 `r',`w',`x',`s',和`t',或八进制数字。
第一个字符列表指定要检查哪些访问权限。如果一个
`u' 给出,则使用文件所有者的那些,如果 `g' 给出,那些
该组被检查,一个`o' 意味着测试其他用户的那些,而 `a”说
测试所有三组。的`=',`+',和`-'再次说明了模式如何
检查并具有与上述第一种形式相同的含义。第二
字符列表最后说明了预期的访问权限:`r' 为了
读取访问权限,`w' 对于写访问,`x' 以获得执行该文件的权利(或
搜索目录),`s' 对于 setuid 和 setgid 位,以及 `t' 对于粘性
位。
因此,`*(f70?)' 给出所有者已读取、写入和执行的文件
许可,并且其他小组成员没有任何权利,独立于
其他用户的权限。模式`*(f-100)' 给出所有文件
所有者没有执行权限,并且`*(f:gu+w,o-rx:)' 给出文件
所有者和组的其他成员至少具有写入权限,
并且其他用户没有读取或执行权限。
e绳子
+CMD 这款 绳子 将作为 shell 代码执行。文件名将包含在
列出当且仅当代码返回零状态(通常是最后一个的状态)
命令)。
在第一种形式中,` 之后的第一个字符e' 将用作分隔符
直到下一个匹配分隔符的任何内容都将被视为 绳子; `[',
`{',和`<' 匹配 `]',`}',和`>',分别,而任何其他字符
与自身相匹配。请注意,扩展必须在 绳子 来阻止他们
在通配完成之前避免被扩展。 绳子 然后作为 shell 执行
代码。字符串 全球性的 被追加到数组中 zsh_eval_context 持续时间
的执行。
执行期间 绳子 当前正在测试的文件名可在
参数 回复;该参数可以更改为要插入的字符串
列表而不是原始文件名。另外,参数 一个回复 也许
设置为数组或字符串,它会覆盖 回复。如果设置为
数组,后者被逐字插入到命令行中。
例如,假设一个目录包含一个文件`寂寞'。然后
表达式`*(e:'回复=(${REPLY}{1,2})':)' 会导致“孤独1'和
`孤独2' 插入到命令行中。注意引用 绳子.
表格 +CMD 具有相同的效果,但周围没有出现分隔符 CMD。 代替,
CMD 被视为跟随的最长字符序列 + ,
字母数字或下划线。通常 CMD 将是 shell 函数的名称
其中包含适当的测试。例如,
nt() { [[ $回复 -nt $NTREF ]] }
NTREF=参考文件
ls -l *(+nt)
列出目录中最近修改过的所有文件
参考资料.
d开发 设备上的文件 开发
l[-|+]ct
链接数小于的文件 ct (-), 比...更棒 ct (+),或等于 ct
U 有效用户 ID 拥有的文件
G 有效组ID所拥有的文件
uid 用户 ID 拥有的文件 id 如果那是一个数字。否则, id 指定一个用户
name:`后面的字符u' 将被视为分隔符和字符串
它和下一个匹配的分隔符之间将被视为用户名。这
起始分隔符 `[',`{',和`<' 匹配最后的分隔符 `]',`}',和`>',
分别;任何其他字符都与其自身匹配。选定的文件是那些
归该用户所有。例如,`你:富:' 或`你[富]' 选择用户拥有的文件
`FOO'.
gid 喜欢 uid 但有组 ID 或名称
a[兆赫兹][-|+]n
准确访问的文件 n 几天前。最近访问的文件 n 天是
使用负值选择 n (-n)。文件访问次数超过 n 几天前
被积极选择 n 值(+n)。可选单位说明符`M',`w',`h',
`m' 或`s'(例如`ah5') 导致检查需要几个月(30 天)执行,
分别是周、小时、分钟或秒而不是天。明确的`d'
几天也是允许的。
访问时间与当前部分之间的差值的任何小数部分
在比较中忽略适当单位的值。例如,`回音
*(ah-5)' 将回显过去五个小时内访问的文件,而 `回音 *(啊+5)'
将回显至少六个小时前访问的文件,因为时间严格在五个小时之间
六小时按五小时处理。
m[兆赫兹][-|+]n
与文件访问限定符类似,只不过它使用文件修改时间。
c[兆赫兹][-|+]n
与文件访问限定符类似,只不过它使用文件 inode 更改时间。
L[+|-]n
文件小于 n 字节(-), 多于 n 字节(+),或者确切地说 n 长度为字节。
如果该标志后面直接跟着一个 尺寸 说明符 `k' (`K'), `m' (`M'), 或 `p'
(`P')(例如`路克-50') 检查以千字节、兆字节或块为单位执行
(512 字节)。 (在某些系统上,附加说明符可用于
千兆字节,`g' 或`G',以及太字节,'t' 或`T'.) 如果使用尺寸说明符
如果文件大小向上舍入到下一个单位,则文件被视为“恰好”大小
等于测试大小。因此`*(LM1)' 匹配从 1 字节到 1 个字节的文件
包含兆字节。另请注意,文件集仅“小于”测试大小
包含与相等性测试不匹配的文件;因此`*(LM-1)' 只匹配
零大小的文件。
^ 否定其后的所有限定符
- 在使限定符对符号链接(默认)和
他们指向的文件
M 设置 标记目录 当前模式的选项
T 将尾随限定符标记附加到文件名,类似于 列表类型
选项,对于当前模式(覆盖 M)
N 设置 NULL_GLOB 当前模式的选项
D 设置 GLOB_DOTS 当前模式的选项
n 设置 NUMERIC_GLOB_SORT 当前模式的选项
Yn 启用短路模式:该模式将扩展到最多 n 文件名。如果
以上 n 存在匹配项,仅第一个 n 按目录遍历顺序匹配
将予以考虑。
暗示 oN 当没有 oc 使用限定符。
oc 指定文件名称的排序方式。如果 c is n 它们的排序依据
姓名;如果是 L 它们根据文件的大小(长度)进行排序;如果 l
它们按链接数量排序;如果 a, m或 c 它们按时间排序
分别是最后一次访问、修改或索引节点更改;如果 d, 文件在
子目录出现在每一级当前目录中的子目录之前
搜索——最好与其他条件结合使用,例如`奥东' 进行排序
同一目录中的文件的名称;如果 N,不进行排序。笔记
这 a, m及 c 将年龄与当前时间进行比较,因此是第一个名字
该列表是最新的文件。还要注意修饰符 ^ 和 - 被使用,所以
`*(^-oL)' 给出按文件大小降序排列的所有文件的列表,
遵循任何符号链接。除非 oN 使用时,可以使用多个顺序说明符
发生来解决关系。
默认排序是 n (按姓名)除非 Y 使用 glob 限定符,其中
情况是这样 N (未排序)。
oe 和 o+ 属于特殊情况;它们各自后跟 shell 代码,按以下方式分隔
此 e glob 限定符和 + 分别是 glob 限定符(见上文)。代码
使用参数对每个匹配的文件执行 回复 设置为名称
条目上的文件和 全局排序 附加到 zsh_eval_context。代码应该修改
参数 回复 以某种方式。返回时,使用参数的值
而不是文件名作为要排序的字符串。与其他排序不同
运营商, oe 和 o+ 可能会重复,但要注意最大排序次数
可能出现在任何 glob 表达式中的任何类型的运算符为 12。
Oc 喜欢`o',但按降序排序;即`*(^oc)' 等同于 `*(奥克)'和
`*(^Oc)' 等同于 `*(奥)'; `Od' 将文件放入当前目录之前
各个搜索级别的子目录中的内容。
[求[,结束]]
指定哪个匹配的文件名应包含在返回的列表中。
语法与数组下标相同。 求 和可选的 结束 也许
数学表达式。正如在参数下标中一样,它们可能是负数
他们从最后一场比赛开始倒数。例如:`*(-OL[1,3])' 给出了一个列表
三个最大文件的名称。
P绳子
这款 绳子 将作为单独的单词添加到每个全局匹配之前。 绳子 is
以与参数相同的方式分隔 e 如上所述的 glob 限定符。
预选赛可以重复;这些词是单独前置的,以便
结果命令行包含的单词的顺序与它们在命令中给出的顺序相同
glob 限定符列表。
一个典型的用途是在所有出现的文件之前添加一个选项
姓名;例如,模式`*(P:-f:)' 产生命令行参数 `-f
file1 -f file2 ...'
如果修饰符 ^ 是活跃的,那么 绳子 将被附加而不是前置。
前置和附加是独立完成的,因此两者都可以在同一个 glob 上使用
表达;例如通过写`*(P:foo:^P:酒吧:^P:baz:)' 产生
命令行参数`FOO 巴兹 file1 酒吧 ...'
可以组合多个这些列表,并用逗号分隔。整个列表匹配
如果至少有一个子列表匹配(它们是“或”,则子列表中的限定符
是“和”)。然而,某些预选赛会影响生成的所有比赛,与比赛无关
给出它们的子列表。这些是限定符`M',`T',`N',`D',`n',`o',
`O' 以及括号中给出的下标 (`[...]“)。
如果一个`:' 出现在限定符列表中,括号中表达式的其余部分是
解释为修饰符(请参阅“历史记录”部分中的“修饰符”部分)
扩张')。每个修饰符必须由单独的 ` 引入:'。另请注意,
修改后的结果不必是现有文件。任何现有的名称
文件后面可以跟一个形式为`的修饰符(:...)' 即使没有实际的文件名
生成被执行,尽管请注意括号的存在会导致
整个表达式要接受任何全局模式匹配选项,例如
NULL_GLOB。 从而:
ls *(-/)
列出所有目录和指向目录的符号链接,以及
ls *(-@)
列出所有损坏的符号链接,以及
ls *(%W)
列出当前目录中所有全局可写的设备文件,以及
ls *(宽,X)
列出当前目录中所有全局可写或全局可执行的文件,以及
回音 /tmp/foo*(u0^@:t)
输出以字符串 ` 开头的所有 root 拥有的文件的基本名称FOO' 在 / tmp目录,
忽略符号链接,以及
ls *.*~(lex|parse).[ch](^D^l1)
列出所有链接计数为名称中包含点的文件(但不包括那些
以点开头,因为 GLOB_DOTS 被明确关闭)除了 词典, lex.h,
解析器.c 和 解析.h.
打印 b*.pro(#q:s/pro/shmo/)(#q.:s/builtin/shmiltin/)
演示如何将冒号修饰符和其他限定符链接在一起。这
普通限定符`.' 首先应用,然后按从左到右的顺序应用冒号修饰符
正确的。因此,如果 EXTENDED_GLOB 已设置并且基本模式与常规文件匹配
内置专业版,shell 将打印 `什米尔丁·什莫'.
使用 onworks.net 服务在线使用 zshexpn