Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在shell脚本中${var#?}的含义是什么_Shell - Fatal编程技术网

在shell脚本中${var#?}的含义是什么

在shell脚本中${var#?}的含义是什么,shell,Shell,我不知道什么?我是说,我搞砸了,什么也没发现 完整文件: ${tag#?}扩展为$tag的值,删除第一个字符 引述: ${parameter#[word]} 删除最小的前缀模式。该单词应为 展开以产生图案。然后,应进行参数扩展 结果在参数中,前缀的最小部分匹配 按模式删除。如果存在,则单词不得以字母开头 不带引号的“#” 在这种情况下,模式为?,与单个字符匹配 如果您使用的是bash,则还包括以下内容(您可以使用info bash查看系统上的手册): “${PARAMETER#WORD}” “$

我不知道什么?我是说,我搞砸了,什么也没发现

完整文件:

${tag#?}
扩展为
$tag
的值,删除第一个字符

引述:

${parameter#[word]}

删除最小的前缀模式。该单词应为 展开以产生图案。然后,应进行参数扩展 结果在参数中,前缀的最小部分匹配 按模式删除。如果存在,则单词不得以字母开头 不带引号的
“#”

在这种情况下,模式为
,与单个字符匹配

如果您使用的是bash,则还包括以下内容(您可以使用
info bash
查看系统上的手册):

“${PARAMETER#WORD}”
“${PARAMETER##WORD}”
这个词被展开以产生一个模式,就像在filename中一样
扩展(*注意文件名扩展::)。如果模式与
参数展开值的开头,然后是
展开式是参数最短的展开值
匹配模式(“#”大小写)或最长匹配模式
(删除“##”一案)。如果参数为“@”或“*”,则模式
依次对每个位置参数应用删除操作,
展开式是结果列表。如果参数是数组
下标为“@”或“*”的变量,模式删除操作
依次应用于数组的每个成员,并且
是结果列表。
=======

那么#?是否删除第一个字符?

顺便说一句,此脚本通常很危险,任何人都不应该运行。扩展
$@
unquoted的行为就像unquoted
$*
(也就是说,它会受到不必要的副作用,如字符串拆分和全局扩展),无正当理由地使用
eval
。将这两者结合起来,可能会产生令人讨厌的效果,比如一个参数包含一个被
*
包围的空格,导致当前目录中的文件名被计算为代码。因为问题不是关于bash,正确的参考不是bash手册页,而是中的节参数扩展。当然,对于这个具体的问题,这也是一样的,因为bash在本例中只使用了sh的语法。@user2352151:我注意到,尽管这个问题是关于shell的,但这里发布的脚本确实包含POSIX中没有的功能,但仅从代码来看,我们仍然无法推断它是bash。乍一看,它也可能是ksh或zsh,在这两种情况下,对bash手册页的引用也可能是不正确的,因此当你问一些问题时,请准确,并适当地标记你的问题。@user1934428谢谢,我没有注意到这一点。我已经更新了我的答案。请不要写问题作为答案。发布一个新问题。
goplat=( darwin windows linux )
# Supported CPU architectures: amd64
goarc=( amd64 )
# Supported database tags
dbtags=( mysql mongodb rethinkdb )

for line in $@; do
  eval "$line"
done

version=${tag#?}

if [ -z "$version" ]; then
  # Get last git tag as release version. Tag looks like 'v.1.2.3', so strip 'v'.
  version=`git describe --tags`
  version=${version#?}
fi
#!/bin/bash
tag='123'
version=${tag#?}
echo ${version}  # output is: 23