命令行 - 在bash中,${_[0]} 是什么意思?

分享于 

3分钟阅读

ubuntu

  繁體

问题:

当我在bash命令行中输入


$ x=hi; printf '%s ' "$x" "${x[0]}"; echo "${_[0]}"



我有以下输出:

 
hi hi hi



  • 为什么"${_[0]}"在输出中是"hi"

答案1:

_参数有多种含义,取决于上下文,但它不是一个数组,同样,在你的示例中,x不是一个数组,之所以能够将其视为数组,是因为Bash允许将非数组变量视为一元数组。Bash同样允许将数组变量视为非数组,给出第一个元素。

man bash:

引用不带下标的数组变量等效于引用带下标0的数组。使用有效下标对变量的任何引用都是合法的,并且bash会在必要时创建一个数组。

"${_[0]}"的行为与"${_}""$_"的行为相同,因为_不是一个数组,同样,"${x[0]}"的行为与"${x}""$x"的行为相同,因为x不是一个数组。

至于_保存值hi的原因:对特殊的_参数执行参数扩展将产生最新(同步执行)命令的最后一个参数。

在这种情况下,最近执行的命令是:


printf '%s ' "$x" "${x[0]}"



  • %s,仅对其执行了引号删除。

答案2:

$_是一个特殊的参数,它以多种方式使用,但在你的情况下,它引用前一个命令的最后一个参数:


$ echo hi Hi Hello


hi Hi Hello


$ echo "$_"


Hello



由于$_是一个变量,而不是一个数组,因此语法${_[0]}只是访问$_


$ echo "$_"


Hello


$ echo "${_[0]}"


Hello




答案3

正如其他人所提到的,${_[0]}${_}的额外类型,它可以缩写为$_,因为它是最常用的。

它是一个包含上一个命令的最后一个参数的变量,一个实用的应用程序如下所示:


$ ll /etc/lsb-release


-rw-r--r-- 1 root root 105 Feb 20 2019 /etc/lsb-release



$ cat $_


DISTRIB_ID=Ubuntu


DISTRIB_RELEASE=16.04


DISTRIB_CODENAME=xenial


DISTRIB_DESCRIPTION="Ubuntu 16.04.6 LTS"



在第一个命令中,最后一个参数是/etc/lsb-release,在第二个命令中,参数为$_,它重复/etc/lsb-release,因此不必重新键入它。



COM  COMM  Comma  命令行  BASH  
相关文章