英语法语西班牙文

OnWorks 网站图标

zshexpn - 云端在线

通过 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器在 OnWorks 免费托管服务提供商中运行 zshexpn

这是命令 zshexpn 可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器

程序:

您的姓名


zshexpn - zsh 扩展和替换

商品描述


以下类型的扩展按指定顺序分五个步骤执行:

发展历程 扩展
这仅在交互式 shell 中执行。

别名 扩展
别名在解析命令行之前立即展开,如所解释的
在别名下 杂项(1)。

流程 换人
产品型号 扩展
命令 换人
算术 扩展
支撑 扩展
这五项操作以从左到右的方式一步执行。 在这些之后
扩展,所有未加引号的字符 `\',`''和`"' 是
除去。

文件名 扩展
如果 SH_FILE_EXPANSION 设置选项后,扩展顺序修改为
与...的兼容性 shKSH. 在这种情况下 文件名 扩张 被执行
之后立马 别号 扩张,在提到的五个扩展集之前
以上。

文件名
这种扩展,通常称为 通配,总是最后完成。

以下部分详细解释了扩展的类型。

历史 扩张


历史扩展允许您在命令行中使用以前命令行中的单词
你正在打字。 这简化了拼写更正和复杂的重复
命令或参数。

在执行之前,每个命令都会保存在历史列表中,其大小
是受 历史大小 范围。 始终保留最近的一条命令
任何状况之下。 历史列表中每条保存的命令称为历史记录 活动 提供美容纤体,
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; 最右边的`?' 在上下文扫描中同样可以是
省略。 注意与上次相同的记录 lr 在所有形式中都得到维护
扩张。

请注意,如果一个`&' 在 glob 限定符中使用,需要额外的反斜杠作为 & 是一个
在这种情况下的特殊字符。

另请注意,扩展的顺序会影响对的解释 lr。 使用时
在历史扩展中,该扩展发生在任何其他扩展之前, lr 被视为
文字字符串(除非解释为 HIST_SUBST_PATTERN 以下)。 当用于
参数扩展,替换 r 首先完成参数值的输入,并且
那么任何附加的过程、参数、命令、算术或大括号引用都是
应用,它可以多次评估这些替换和扩展,如果 l 出现
超过起始值一次。 当在 glob 限定符中使用时,任何替换或
扩展在解析限定符时执行一次,甚至在`之前:s'
表达式本身分为 lr 两侧。

如果是选项 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, wW 修饰符仅适用于参数扩展和文件名
一代。 此处列出它们是为了为所有人提供单一参考点
修饰符。

f 重复紧随其后(不带冒号)的修饰符,直到结果
这个词不再改变。

F:表达式:
喜欢 f,但仅重复 n 次如果表达式 表达式 评估为 n。 任何
可以使用字符代替 `:'; 如果`(',`[',或`{' 用作
开始分隔符,结束分隔符应该是 ')',`]',或`}', 分别。

w 使紧随其后的修饰符作用于字符串中的每个单词。

W:九月: 喜欢 w 但单词被认为是字符串中由 分隔的部分
九月。 可以使用任何字符代替 `:'; 左括号已处理
特别是,见上文。

疗程开始前 代换


命令参数的每个部分采用以下形式:<(名单)',`>(名单)' 或`=(名单)' 是
受工艺替代的影响。 该表达式之前或之后可以是其他表达式
字符串不同的是,为了防止与常见的字符串和模式发生冲突,
最后一个形式必须出现在命令参数的开头,并且形式仅展开
当第一次解析命令或赋值参数时。 可以使用流程替代
遵循重定向运算符; 在这种情况下,替换必须出现且没有
尾随字符串。

在的情况下 < or > 形式,shell 运行命令 名单 作为一个子过程
执行 shell 命令行的作业。 如果系统支持 /开发/FD 机制,
命令参数是文件描述符对应的设备文件的名称;
否则,如果系统支持命名管道(FIFO),则命令参数将是
命名管道。 如果表格带有 > 选择然后在这个特殊文件上写入将提供
输入 名单。 如果 < 使用,那么作为参数传递的文件将连接到
的输出 名单 过程。 例如,

<(切 -f1 file1) <(切 -f3 file2) |
开球 >(进程1) >(进程2) > / dev /空

从文件中删除字段 1 和 3 file1file2 分别粘贴结果
一起发送给进程 进程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 已设置,或 $奥帕特 而是替换为 ${~奥帕特}.

这款 模式 可能以`开头#',在这种情况下 模式 必须在开始时匹配
字符串的,或`%',在这种情况下它必须匹配字符串的末尾,或者
`#%'在这种情况下 模式 必须匹配整个字符串。 这 代表 可能是一个
空字符串,在这种情况下最后的`/' 也可以省略。 引用最后的
`/' 在其他情况下,它前面应该有一个反斜杠; 这不是
必要时,如果`/' 出现在替换参数内。 另请注意,
`#',`%'和`#% 如果它们出现在替换参数内,则不处于活动状态,即使
在开始时。

第一个`/' 前面可以有一个 `:',在这种情况下匹配才会成功
如果它匹配整个单词。 还要注意的效果 IS 参数
下面的扩展标志; 然而,旗帜 M, R, B, EN 没有用。

例如,

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 内置的序列。 与两者 oe 期权,
行为类似于 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 标志可用于设置
单词分隔符。

Ww 不同之处在于重复分隔符之间的空词是
也算了。

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 没有给出。 如果两者都 string1string2
给出, 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 ${...%...} 形式。 这 SI
标志也可以与 ${.../...} 形式。

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, ul 填充和大写标志直接应用于
参数值。请注意,这些标志是命令的选项,例如`排版 -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}', 在哪里 n1n2 是整数,扩展到每个
之间的数字 n1n2 包括的。如果任一数字以零开头,则所有
结果数字将用前导零填充到最小宽度,但对于
负数 - 字符也包含在宽度中。如果数字在
降序 生成的序列也将按降序排列。

形式的表达式 `{n1..n2..n3}', 在哪里 n1, n2n3 是整数,被展开
如上所述,但只有每个 n3第一个数字从 n1 是输出。如果 n3 是负数
数字以相反的顺序输出,这与简单交换略有不同 n1
n2 在该步骤的情况下 n3 没有均匀地划分范围。零填充可以是
在三个数字中的任何一个中指定,在第三个数字中指定它可以用于填充
例子`{-99..100..01}' 不可能通过在其中任何一个上放置 0 来指定
前两个数字(即填充两个字符)。

形式的表达式 `{c1..c2}', 在哪里 c1c2 是单个字符(可能是
多字节字符),扩展到范围内的每个字符 c1c2 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 中的),则使用它
例如)比任何静态名称匹配的长度都要长。

不要求函数同时实现这两个功能 nd 来电;例如,它
可能适合某些不收缩为名称的动态扩展形式。
在这种情况下,任何带有第一个参数的调用 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]>
匹配范围内的任意数字 xy, 包括的。任一数字都可以是
省略使范围成为开放式;因此`<->' 匹配任何数字。匹配
个别数字, [...] 形式更加高效。

在这种形式的模式旁边使用其他通配符时要小心;为了
例, * 实际上会匹配开头的任何数字
字符串,因为`<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} 定期地
表达式。前一个字符或组需要在之间匹配 NM
次,包容。表格 (#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_GLOBEXTENDED_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, mc 它们按时间排序
分别是最后一次访问、修改或索引节点更改;如果 d, 文件在
子目录出现在每一级当前目录中的子目录之前
搜索——最好与其他条件结合使用,例如`奥东' 进行排序
同一目录中的文件的名称;如果 N,不进行排序。笔记
a, mc 将年龄与当前时间进行比较,因此是第一个名字
该列表是最新的文件。还要注意修饰符 ^- 被使用,所以
`*(^-oL)' 给出按文件大小降序排列的所有文件的列表,
遵循任何符号链接。除非 oN 使用时,可以使用多个顺序说明符
发生来解决关系。

默认排序是 n (按姓名)除非 Y 使用 glob 限定符,其中
情况是这样 N (未排序)。

oeo+ 属于特殊情况;它们各自后跟 shell 代码,按以下方式分隔
e glob 限定符和 + 分别是 glob 限定符(见上文)。代码
使用参数对每个匹配的文件执行 回复 设置为名称
条目上的文件和 全局排序 附加到 zsh_eval_context。代码应该修改
参数 回复 以某种方式。返回时,使用参数的值
而不是文件名作为要排序的字符串。与其他排序不同
运营商, oeo+ 可能会重复,但要注意最大排序次数
可能出现在任何 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


免费服务器和工作站

下载 Windows 和 Linux 应用程序

  • 1
    PAC 经理
    PAC 经理
    PAC 是 Perl/GTK 的替代品
    SecureCRT/Putty/等(Linux
    ssh/telnet/... gui)... 它提供了一个 GUI
    配置连接:用户,
    密码,EXPECT 规则...
    下载 PAC 管理器
  • 2
    GeoServer的
    GeoServer的
    GeoServer是一个开源软件
    用 Java 编写的服务器,允许用户
    共享和编辑地理空间数据。
    专为互操作性而设计,它
    发表...
    下载地理服务器
  • 3
    萤火虫III
    萤火虫III
    免费和开源的个人理财
    经理。 Firefly III 具有
    复式簿记系统。 你可以
    快速输入并整理您的
    交易我...
    下载萤火虫III
  • 4
    Apache OpenOffice 扩展
    Apache OpenOffice 扩展
    Apache的官方目录
    OpenOffice 扩展。 你会找到
    扩展范围从字典到
    用于导入 PDF 文件和连接的工具
    与外...
    下载 Apache OpenOffice 扩展
  • 5
    螳螂BT
    螳螂BT
    Mantis 是一个易于部署的网络
    基于错误跟踪器来帮助产品错误
    追踪。 它需要 PHP、MySQL 和一个
    网络服务器。 查看我们的演示并托管
    提供...
    下载MantisBT
  • 6
    LAN Messenger
    LAN Messenger
    LAN Messenger 是一个 p2p 聊天应用程序
    用于 Intranet 通信,并且不
    需要服务器。 各种得心应手
    支持的功能包括
    通知...
    下载 LAN Messenger
  • 更多 ”

Linux 命令

Ad