${_[0]} 在 bash 中是什么意思?

SWI*_*WII 11 command-line bash

当我在 bash 命令行中键入此内容时

$ x=hi; printf '%s ' "$x" "${x[0]}"; echo "${_[0]}"
Run Code Online (Sandbox Code Playgroud)

我有这个输出:

hi hi hi
Run Code Online (Sandbox Code Playgroud)
  • 为什么"${_[0]}"结果是"hi"在输出中?
  • 为什么我们可以使用"x[0]"语法,因为它"x"只是一个string而不是一个array

Eli*_*gan 19

_根据上下文,该参数有多种含义,但它绝不是数组。同样,在您的示例中,x不是数组。您能够将其视为数组的原因是Bash 允许将非数组变量视为单元素数组。Bash 同样允许将数组变量视为非数组,给出第一个元素。

正如man bash所说:

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

所以"${_[0]}"行为与"${_}"or相同"$_",因为_不是数组。同样,"${x[0]}"行为与"${x}"or相同"$x",因为x它不是数组。


至于为什么_保留值hi:在您展示的用法中,对特殊参数执行参数扩展会_产生最近(同步执行)命令的最后一个参数。

正如man bash所说_

在 shell 启动时,设置为用于调用在环境或参数列表中传递的正在执行的 shell 或 shell 脚本的绝对路径名。随后,在扩展后扩展到在前台执行的前一个简单命令的最后一个参数。还设置为用于调用在导出到该命令的环境中执行和放置的每个命令的完整路径名。检查邮件时,此参数保存当前正在检查的邮件文件的名称。

(强调我的)

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

printf '%s ' "$x" "${x[0]}"
Run Code Online (Sandbox Code Playgroud)

传递给的参数printf是:

  • %s , 只执行了引用删除。
  • hi,对其执行参数扩展,然后删除引号。
  • hi,在其上执行了产生相同结果的更复杂形式的参数扩展,然后去除引号。


Joh*_*024 13

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

$ echo hi Hi Hello
hi Hi Hello
$ echo "$_"
Hello
Run Code Online (Sandbox Code Playgroud)

因为$_是一个变量,一个阵列中,语法${_[0]}是只是没用杂波访问$_

$ echo "$_"
Hello
$ echo "${_[0]}"
Hello
Run Code Online (Sandbox Code Playgroud)

文档

来自man bash

$_
在 shell 启动时,设置为用于调用在环境或参数列表中传递的正在执行的 shell 或 shell 脚本的绝对路径名。 随后,在扩展后扩展到在前台执行的前一个简单命令的最后一个参数。 还设置为用于调用在导出到该命令的环境中执行和放置的每个命令的完整路径名。检查邮件时,此参数保存当前正在检查的邮件文件的名称。

我用粗体突出显示了与您的使用相关的部分。


Win*_*nix 5

正如其他人所提到的${_[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"
Run Code Online (Sandbox Code Playgroud)

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