/bin/sh 関数の最後のパラメータを取得する方法

/bin/sh 関数の最後のパラメータを取得する方法

これを実装するより良い方法は何ですかprint_last_arg

#!/bin/sh

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

print_last_arg foo bar baz
# baz

(そうであれば、どうすればいいかわかります#!/usr/bin/zsh#!/bin/sh私の問題は、これを達成するための合理的な方法を見つけることです#!/bin/sh。)

編集:上記は愚かな例です。私の目標は印刷最後のパラメータですが、シェル関数で最後のパラメータを参照する方法があります。


編集2:このように明確ではない質問についてお詫び申し上げます。 今回はきちんと解決してほしい。

これが代わりに/bin/zsh/bin/sh私はこのようなものを書くことができたでしょう

#!/bin/zsh

print_last_arg () {
    local last_arg=$argv[$#]
    echo $last_arg
}

表現は、$argv[$#]最初の編集で説明した例です。シェル関数で最後のパラメータを引用する方法

したがって、元の例を次のように書く必要がありました。

print_last_arg () {
    local last_arg=$(eval "echo \${$#}")   # but this hurts even more
    echo $last_arg
}

...私が望むものが何であるかを明確にするために、課題の右側にあまり怖いものが配置されています。

ただし、すべての例で最後のパラメータにアクセスされることに注意してください。非破壊的。 IOW、最後のパラメータにアクセスしても、全体の位置パラメータには影響しません。

ベストアンサー1

オープンピラー(スペースなしの位置パラメータ)を提供する例:

print_last_arg foo bar baz

基本項目の場合はIFS=' \t\n'次のとおりです。

args="$*" && printf '%s\n' "${args##* }"

より安全に拡張するには、"$*"IFSを設定します(@StéphaneChazelasベース)。

( IFS=' ' args="$*" && printf '%s\n' "${args##* }" )

ただし、位置パラメータにスペースを含めることができる場合、上記の方法は失敗します。この場合は、以下を使用してください。

for a in "$@"; do : ; done && printf '%s\n' "$a"

これらの技術は回避され、eval副作用はありません。

テスト対象shellcheck.net

おすすめ記事