相关疑难解决方法(0)

有没有办法用 bash 读取数组的最后一个元素?

如果我有一个包含 5 个元素的数组,例如:

[a][b][c][d][e]
Run Code Online (Sandbox Code Playgroud)

使用echo ${myarray[4]}我可以看到它包含什么。

但是如果我不知道给定数组中的元素数量怎么办?有没有办法读取未知长度数组的最后一个元素?即任何数组从右到左读取的第一个元素?

我想知道如何在 bash 中做到这一点。

bash array

98
推荐指数
4
解决办法
12万
查看次数

如何获取/bin/sh 函数的最后一个参数

什么是更好的实施方式print_last_arg

#!/bin/sh

print_last_arg () {
    eval "echo \${$#}"  # this hurts
}

print_last_arg foo bar baz
# baz
Run Code Online (Sandbox Code Playgroud)

(如果这是,#!/usr/bin/zsh而不是#!/bin/sh我知道该怎么做。我的问题是找到一种合理的方法来实现这一点#!/bin/sh。)

编辑:以上只是一个愚蠢的例子。我的目标不是打印最后一个参数,而是有一种方法来引用 shell 函数中的最后一个参数。


EDIT2:对于这样一个措辞不清的问题,我深表歉意。 我希望这次能做对。

如果这是/bin/zsh而不是/bin/sh,我可以写这样的东西

#!/bin/zsh

print_last_arg () {
    local last_arg=$argv[$#]
    echo $last_arg
}
Run Code Online (Sandbox Code Playgroud)

该表达式$argv[$#]是我在第一次编辑中作为引用 shell 函数中最后一个参数的一种方式所描述的示例。

因此,我真的应该像这样编写我的原始示例:

print_last_arg () {
    local last_arg=$(eval "echo \${$#}")   # but this hurts even more
    echo $last_arg
}
Run Code Online (Sandbox Code Playgroud)

...明确表示我所追求的东西放在作业的右边是一件不那么糟糕的事情。

但是请注意,在所有示例中,最后一个参数都是非破坏性访问。IOW,访问最后一个参数使位置参数作为一个整体不受影响。

shell-script

13
推荐指数
1
解决办法
4028
查看次数

获取 $@ / argv / 参数数组的最后一个元素而不使用 eval

如果我做:

set a b c
Run Code Online (Sandbox Code Playgroud)

如何访问 的最后一个元素$@,即c

我最初想为$@数组添加下标:

"${@[$#-1]}"
Run Code Online (Sandbox Code Playgroud)

但:

bash: ${@[$#-1]}: bad substitution
Run Code Online (Sandbox Code Playgroud)

我最终想出了:

eval echo "\$$#"
Run Code Online (Sandbox Code Playgroud)

有没有办法获得$@without的最后一个元素eval

是首先将其复制到另一个数组并访问的唯一方法吗${copy[-1]}

bash

1
推荐指数
1
解决办法
2228
查看次数

标签 统计

bash ×2

array ×1

shell-script ×1