我找到了以下内容,想知道在哪里可以找到手册:
? echo ${#}
1
? echo ${##}
1
? echo ${?}
0
? echo ${??}
0
? echo ${!}
0
? echo ${-}
569JNORXZghiklms
? echo ${--}
569JNORXZghiklms
Run Code Online (Sandbox Code Playgroud)
ilk*_*chu 10
在大约两个不同的地方,至少在 Bash 的手册中。这些应该是标准特性,并且在每个 shell 中都是相似的,即使${-}
这里的实际值看起来像是来自 Zsh。
$ echo ${#}
1
$ echo ${?}
0
$ echo ${!}
0
$ echo ${-}
569JNORXZghiklms
Run Code Online (Sandbox Code Playgroud)
这些是特殊参数 #
, ?
, !
, 和-
,用可选的大括号扩展。使用$#
, $?
,$!
或$-
将是相同的。还有一些其他特殊参数,它们的“名称”${foo}
是单个非字母非数字字符,通常与 相同,$foo
但在类似情况下需要大括号${foo}bar
,因为$foobar
将被视为${foobar}
.
特别是,
$#
是脚本或当前函数的位置参数或自变量的数量。试试fun() { echo $#; }; fun a b c;
。
$?
是最后一个前台命令或管道 ( ls -l /doesnotexist; echo $?
)的退出状态。
$!
如果是最新的后台作业 ( sleep 2 & ps uax |grep $!
),则为进程 ID ,以及
$-
有效的set
标志列表。(还有setopt
Zsh 中的一些标志。Zsh 似乎也给出$!
了0
好像没有这样的工作,Bash 将其显示为未设置。)
$ echo ${##}
1
$ echo ${??}
0
$ echo ${--}
569JNORXZghiklms
Run Code Online (Sandbox Code Playgroud)
这些是特殊参数#
、?
和-
,但包含额外的参数扩展操作。(我不知道怎么称呼它们,它们只是参数扩展的一部分。)
${#parameter}
是parameter值的长度,所以当$#
是1
(或0
等)时,${##}
是1
,和foo=abc
,${#foo}
是3
。
(有点相关,${parameter#word}
删除一个前缀,它将是参数的值,其中前导部分匹配的单词被删除(例如foo=abcdef; echo ${foo#??}
给出,cdef
因为?
匹配任何一个字符)。特殊情况${##}
可以解释为要么取长度,要么删除空前缀,但长度扩展在这里胜过。${parameter%word}
是相同的,但它删除了尾随部分。)
${parameter?word}
是一个“检查是否设置”的扩展,如果它被设置,它会给出参数的值,否则会抛出一个错误,包含word给出的文本。$?
始终设置,因此检查不会做太多事情,但请尝试unset foo; echo ${foo?unset value\!}
.
${parameter-word}
是“默认值”扩展,如果设置了参数,则采用参数值,否则采用word。$-
始终设置,因此您可以获得它的价值。但如果foo
没有设置,${foo-bar}
将是bar
。
最后两个和其他类似的有带有冒号${parameter:?word}
和的变体,${parameter:?word}
当参数设置为空字符串时也会触发。Bash 的手册在这里可能更清楚,它提到了文本中的差异,但没有列出没有冒号的形式。不过,POSIX 文本有一个不错的 table。
这一事实#
,?
并-
在这里有两种不同的含义仅仅是一个巧合,还是具有一组有限的特殊字符,并使用用于使用一个相当简洁的语法壳的结果。
归档时间: |
|
查看次数: |
77 次 |
最近记录: |