我试图理解一个脚本,它使用以下命令:set -- ${line#?}
。我理解 set 命令和大括号。但我找不到“#?”的任何解释。部分。
答案1
${line#?}
,标准sh
参数扩展运算符(源自 Korn shell)只是从变量 中删除第一个字符line
。例如:
$ line=abc; echo "${line#?}"
bc
更一般地,${variablename#word}
从word
开始的内容variablename
。这就是所谓的前缀去除。 word
被视为一个 glob,这意味着?
匹配任何单个字符。
文档
来自man bash
(解释器bash
的 GNU 实现在哪里sh
):
${parameter#word}
${parameter##word}
删除匹配的前缀模式。 被word
扩展以产生一个模式,就像在路径名扩展中一样,并使用下面的模式匹配中描述的规则与参数的扩展值进行匹配。如果模式与parameter值的开头匹配,则扩展的结果是parameter的扩展值,并删除了最短匹配模式(case#
)或最长匹配模式(##
case)。如果参数是@
或*
,则模式删除操作依次应用于每个位置参数,并且扩展是结果列表。如果参数是一个下标为@
或 的数组变量*
,则模式删除操作将依次应用于数组的每个成员,并且扩展是结果列表。
旁白:删除后缀
就像${parameter#word}
和${parameter##word}
做一样字首删除,了解 shell 还提供${parameter%word}
以及${parameter%%word}
哪些功能是有帮助的后缀移动。后缀删除通常用于删除文件名中的扩展名:
$ name=file.jpg; echo "${name%.jpg}"
file