AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 486657
Accepted
YardenST
YardenST
Asked: 2018-12-08 11:51:59 +0800 CST2018-12-08 11:51:59 +0800 CST 2018-12-08 11:51:59 +0800 CST

如何从最后的位置获取 bash 脚本参数?[复制]

  • 772
这个问题在这里已经有了答案:
如何获取 /bin/sh 函数的最后一个参数 11 个答案
获取 $@ / argv / arguments 数组的最后一个元素,无需 eval [重复] (1 个回答)
3年前关闭。

我有一个 shell 脚本,我想使用最后一个参数:

#!/bin/bash
echo My last param is #somehow put it here

这是我尝试过的:

echo $$#
echo ${$#}
echo ${(($#))}

不幸的是,它没有用。

我特别想了解为什么我的选择不起作用,我想做一些类似双重扩展的事情。

从更广泛的意义上说,我想知道如何从最后访问第 N 个参数。我该如何做到这一点?

shell-script shell
  • 6 6 个回答
  • 5921 Views

6 个回答

  • Voted
  1. MatthewRock
    2018-12-08T12:06:58+08:002018-12-08T12:06:58+08:00

    要从bash脚本中获取任何参数,您可以使用切片:

    #!/bin/bash
    
    # Get 3rd element from the end
    from_end1=3
    # Get last element
    from_end2=1
    
    # Get slice of array [end - from_end1 : end ] of length 1
    echo "${@: -$from_end1: 1}"
    echo "${@: -$from_end2: 1}"
    

    您还可以使用它来获取第 N 个元素:

    # Get 2nd element
    from_beginning=2
    
    echo "${@: $from_beginning: 1}"
    

    记得检查长度;这可能会返回您的程序名称或空字符串。

    • 5
  2. Kusalananda
    2018-12-08T12:03:16+08:002018-12-08T12:03:16+08:00

    在bash(4.3+ 版)中,您可以将传递的参数分配给数组并通过索引访问最后一个-1:

    #!/bin/bash
    
    params=( "$@" )
    printf 'The last parameter given to the script is %s\n' "${params[-1]}"
    
    foo () {
        params=( "$@" )
        printf 'The last parameter given to the function is %s\n' "${params[-1]}"
    }
    

    通常,数组的负索引从数组末尾访问元素。

    • 4
  3. R.. GitHub STOP HELPING ICE
    2018-12-08T16:14:13+08:002018-12-08T16:14:13+08:00

    可移植sh的,不是特定于 bash 的,并且没有 O(n) 循环:

    eval x=\$$(($#-1))
    

    -1产生倒数第二个论点;将其替换为您想要的相对于末尾的位置,或者如果您想要最后一个位置,则将其完全删除。

    • 4
  4. Best Answer
    Ljm Dullaart
    2018-12-08T12:18:27+08:002018-12-08T12:18:27+08:00

    此外(对 Kusalananda 的回答):

    #! /bin/bash 
    
    echo "(bash/ksh): ${@: -1}"
    echo "(bash 3.x+): ${!#}"
    echo "(bash 3.x+): $BASH_ARGV"
    echo "(bash 3.x+/ksh): ${@:$#}"
    echo "(bash 3.x+): ${BASH_ARGV[0]}"
    

    如果您担心便携性:

    #!/bin/bash
    
    penultimate=''
    ultimate=''
    
    for p in "$@" ; do
        penultimate="$ultimate"
        ultimate="$p"
    done
    
    echo "penultimate=$penultimate"
    echo "ultimate=$ultimate"
    
    • 3
  5. user232326
    2018-12-08T18:14:38+08:002018-12-08T18:14:38+08:00

    POSIX shell(也适用于 ksh、zsh 或 bash)的经典解决方案是:

     for last do :;done; echo "last=$last"
     eval "last=\$$#"; echo "last=$last"
    

    对于较新的 shell(ksh93、zsh、bash):

     echo "last=${@: -1}"
     echo "last=${@:(-1)}"
     echo "last=${@:~0}"
     echo "last=${@:$#}"
    

    仅适用于:

    bash echo "last=${!#}"
    bash echo "last=$BASH_ARGV"
    zsh echo "last=${@[-1]}"
    zsh echo "last=${@[#]}"

    对于倒数第二个论点:

     for arg do penultimate=$ultimate; ultimate=$arg; done; echo "$penultimate"
     eval penultimate=\$$((#-1))
     echo "${@:$((#-1)):1}"
     echo "${@: -2:1}"
     echo "${@:~1:1}"
    
    • 1
  6. JoL
    2018-12-08T14:21:25+08:002018-12-08T14:21:25+08:00

    在 zsh 中,我认为最自然的事情是:

    echo "ultimate: ${@[$#]}"
    echo "ultimate: ${@[-1]}"
    echo "penultimate: ${@[-2]}"
    echo "penultimate: ${@[$(($# - 1))]}"
    
    • 0

相关问题

  • 打印文件行及其长度的脚本[关闭]

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 按分隔符拆分并连接字符串问题

  • 如何将带有〜的路径保存到变量中?

  • MySQL Select with function IN () with bash array

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve