Parameters 手册中的“zsh数组参数”我不能完全理解。有人能举例说明这一点吗?
我唯一能理解的是$FOO[2,5]。但r、r、s、w选项我不清楚如何在实际问题中使用它们: “zsh”网站上说: 阵列参数 数组参数的值可以通过以下方式指定: 名称=值 可以使用下标选择数组的各个元素。[exp]形式的下标选择单个元素exp,其中exp是一个算术表达式,它将接受算术展开,就像它被$..包围一样。。。。元素从1开始编号,除非从零开始编号时设置了KSH_ARRAYS选项 []或[@]形式的下标计算为数组的所有元素;两者之间没有区别,除非它们出现在双引号内$foo[]的计算结果为$foo[1]$foo[2]…,而$foo[@]的计算结果为$foo[1]$foo[2],以此类推 [exp1,exp2]形式的下标选择exp1到exp2范围内的所有元素。如果其中一个下标的计算结果为负数,例如-n,则使用数组末尾的第n个元素。因此,$foo[-3]是数组foo末尾的第三个元素,$foo[1,-1]与$foo[*]相同 也可以对非数组值执行下标,在这种情况下,下标指定要提取的子字符串。例如,如果FOO设置为foobar,那么echo$FOO[2,5]将打印ooba 可以在用于分隔参数名的大括号内使用下标,因此${foo[2]}相当于$foo[2]。如果设置了KSH_ARRAYS选项,则大括号形式是唯一可以工作的形式,否则不会对下标进行特殊处理 如果在赋值的左侧使用下标,则选定范围将替换为右侧的表达式 如果左括号或逗号后面紧跟着一个左括号,则匹配的右括号之前的字符串将被视为标志列表。目前了解的标志有: e 此选项无效,仅为向后兼容而保留。 W 如果subscripted参数是标量,则此标志将使订阅基于每个字而不是字符工作。 s:字符串: 定义用于分隔与w标志一起使用的单词的字符串。 P 识别与后续s标志的字符串参数中的打印内置项相同的转义序列。 F 如果subscripted参数是标量,则此标志将使订阅以每行为单位而不是以字符为单位工作。这是pws的缩写:\n:。 R 如果给定该标志,则exp作为模式,如果参数是数组,如果参数是标量,或者如果参数是标量,则结果是第一个匹配的数组元素、子字符串或字,并且分别给出了w标志;注意,这就像给出一个数字:$foo[r??,3]和$foo[r??,rf*]work。 R 喜欢r,但给出最后一个匹配。 我 与r类似,但给出匹配的索引;这不能与第二个参数结合使用。 我 和我一样,但给出了最后一次匹配的索引。 n:expr:Parameters 手册中的“zsh数组参数”我不能完全理解。有人能举例说明这一点吗?,parameters,zsh,Parameters,Zsh,我唯一能理解的是$FOO[2,5]。但r、r、s、w选项我不清楚如何在实际问题中使用它们: “zsh”网站上说: 阵列参数 数组参数的值可以通过以下方式指定: 名称=值 可以使用下标选择数组的各个元素。[exp]形式的下标选择单个元素exp,其中exp是一个算术表达式,它将接受算术展开,就像它被$..包围一样。。。。元素从1开始编号,除非从零开始编号时设置了KSH_ARRAYS选项 []或[@]形式的下标计算为数组的所有元素;两者之间没有区别,除非它们出现在双引号内$foo[]的计算结果为$fo
如果与r、r、i或i组合,则如果expr的计算结果为n,则使它们返回第n个或第n个最后匹配项。不确定引用的来源,因为该文本不会显示在链接的页面上。下面是一些正在使用的标志的示例:
# If the parameter subscripted is a scalar
foo="The quick brown fox jumps over the lazy dog"
echo $foo[2]
# => h (the second character)
echo $foo[(w)2]
# => quick (the second word)
echo $foo[(ws:fox:)2]
# => jumps over the lazy dog (the second "word", but delimited by "fox", not space)
echo $foo[(wr)*az*]
# => lazy (the first word that matches the pattern "*az*")
echo $foo[(wR)?????]
# => jumps (the last word that matches the pattern "?????")
echo $foo[(wrn.2.)???]
# => fox (the second three-letter word)
echo $foo[(wrin.2.)???]
# => 17 (the index of second three-letter word)
# If the parameter subscripted is an array
foo=("The quick brown fox" jumps "over the lazy dog")
echo $foo[1]
# => The quick brown fox (The first element)
echo $foo[(r)*the*dog]
# => over the lazy dog (The first element that matches the pattern "*the*dog")
对于更真实的问题,假设我有一个包含
DB_NAME=mydb
DB_USER=me
DB_PASS=not real password
DB_HOST=localhost
DB_PORT=5432
然后,这将在不使用外部实用程序(如grep、sed或awk)的情况下读取您的密码:
伟大的谢谢你对我的帮助!s:string:这给出了分隔单词的字符串,以便与w标志一起使用。分隔符字符:是任意的;见上文。->你能举例说明这种用法吗?所有内容都来自我在问题中提供的链接。zsh,第15章。参数它意味着$foo[ws:fox:2]相当于$foo[ws.fox.2]、$foo[wsfox2],甚至是echo$foo[wswfoxw2]。请不要使用最后一个这是你从哪里得到的诸如“ws”、“wR”、“wrn”之类的信息?因为我在网上找不到这个。提前谢谢,就在你的问题里。它不是ws;它是w和s:string:,这两个标志一起指定。w如果subscripted参数是标量,则此标志使订阅按每个字而不是字符工作。s:string:定义用于分隔与w标志一起使用的单词的字符串。s:string:定义用于分隔与w标志一起使用的单词的字符串。@SungwookKim:在zshparam手册页中。查找标题为“下标标志”的部分。
file=$(<.pass) # read in the file contents
line=$file[(fr)DB_PASS=*] # find the line (f) that matches pattern (r)
pass=$line[(ws:=:)2] # get the second (2) segment (w) split by "=" (s:=:)