脚本中的“${line#?}”是什么意思?

脚本中的“${line#?}”是什么意思?

我试图理解一个脚本,它使用以下命令: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

相关内容