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

use*_*050 4 shell shell-script

我正在尝试理解一个使用以下命令的脚本:set -- ${line#?}. 我理解 set 命令和大括号。但我找不到“#?”的任何解释。部分。

Joh*_*024 17

${line#?},标准sh参数扩展运算符(源自 Korn shell)只是从变量 中删除第一个字符line。例如:

$ line=abc; echo "${line#?}"
bc
Run Code Online (Sandbox Code Playgroud)

更一般地,${variablename#word}除去word开始的内容variablename。这称为前缀删除word被视为一个 glob,这意味着?匹配任何单个字符。

文档

来自man bash(解释器bash的 GNU 实现在哪里sh):

${parameter#word}
${parameter##word}

删除匹配的前缀模式。word被膨胀,以产生一个模式,就像在路径名扩展,和反对使用根据下文模式匹配所描述的规则参数的扩展后的值相匹配。如果拍拍?tern 匹配parameter 的值的开头,那么展开的结果是删除了最短匹配模式(# 案例)或最长匹配模式(##案例)的参数的扩展值 。如果参数是@*,则依次对每个位置参数应用模式移除操作,扩展为结果列表。如果参数是一个带有@或下标的数组变量*,模式移除操作依次应用于数组的每个成员,并且 ex? pansion 是结果列表。

旁白:去除后缀

正如${parameter#word}${parameter##word}前缀去除,它是让你知道,外壳也提供${parameter%word}${parameter%%word}其做后缀去除。后缀删除通常用于从文件名中删除扩展名:

$ name=file.jpg; echo "${name%.jpg}"
file
Run Code Online (Sandbox Code Playgroud)

  • 这就是我的假设,谢谢你的回答! (2认同)
  • 提及 `%`/`%%` 也可用(我更频繁地使用它,以去除扩展名)可能会有所帮助。 (2认同)