関数パラメータを渡しますか?

関数パラメータを渡しますか?

パラメータを使用する関数をどのように作成しますか?

function arg_example {
    arg "c"  # This is imaginary but it would return 'true' if it found the argument -c.
    did_find_arg=$?  # Get the previous function (arg)'s output.

    if [$did_find_arg == 'true']; then
        echo "Yes!"
    else
        echo "Not found."
    fi
}

# Testing
arg_example  # "Not found."
arg_example -c  # "Yes!"
arg_example -k  # "Not found."

また、次のKey-Value関数の値を見つける方法は何ですか--name

function hello {
    echo "Hello, $--name!"
}

$1編集:andの使い方を知っていますが、orのような$2オプションのものを取得する方法を知りたいです。-v--version

答え1

コマンドライン処理機能getoptsコマンドラインを処理するのと同じ方法で実行できます。スクリプト。注目すべき唯一のことは、OPTINDこれを1にリセットするか、関数に対してローカルにする必要があることです。

#!/bin/bash

myfunc () {
    local OPTIND
    local do_c=0
    local do_k=0
    local opt

    while getopts 'ck' opt; do
        case $opt in
            c) do_c=1 ;;
            k) do_k=1 ;;
            *) echo 'Error in command line parsing' >&2
               return 1
        esac
    done
    shift "$(( OPTIND - 1 ))"

    if [ "$do_c" -eq 1 ]; then
        echo 'Yes!'
    else
        echo 'Not found'
    fi
}

myfunc
myfunc -c
myfunc -k
myfunc -a

上記のスクリプトは以下を生成します。

Not found
Yes!
Not found
script.sh: illegal option -- a
Error in command line parsing

関連:

答え2

Bashのための非常に簡単な名前付きパラメータ抽出器:

#!/bin/bash

getargs()
{
  local out=""
  for argname in "$@"; do
    out="${out}local $argname=\$1; shift;"
  done
  printf "%s" "$out"
}

testfun()
{
  eval $(getargs a b c)
  printf "a = %s, b = %s, c = %s\n" "$a" "$b" "$c"
}

testfun "$@"                                                                                                  

引数が関数の動的範囲内のローカル変数になりたいので、関数呼び出しにすることはできませんtestfungetargsしかしgetargs小さい翻訳者a b cパラメータ仕様をシェルに変換します。通事論、位置パラメータをローカル変数に入れるために手動で追加するコードを生成します。

たとえば、出力

getargs a b c

ソースコードは次のとおりです。

local a=$1; shift;local b=$1; shift;local c=$1; shift

そうすると、eval見えるように動作します。呼び出し元のコンテキストで最初の3つの位置引数をabおよびに入れてc引数リストから移動します。

今、私たちは次のステップに進み、「素晴らしいもの」を追加できます。

まず、生成されたコードは次のようになります。確認する実際には3つの主張と診断があります。

オプションのパラメータをサポートできます。(getargs a b : cまたはその他)これは必須であることを意味できますが、aオプションbですc。末尾のパラメータもサポートできます。getargs a b : c . d最初の2つのパラメータ(必須)をローカルに作成しab存在する場合は3番目のパラメータを入力できますc。それ以降のすべての引数はdBash配列に入ります。

練習として残しておきます。

残念ながら、シェルにはマクロ拡張時間がありません。これの大きな欠点は、完全に静的であっても関数が呼び出されるたびにコードが生成されることです。

Awkのようないくつかのプリプロセッサを書くことによって、いくつかの名前付き関数構文砂糖を通常のシェルコードに変換することができます。

関連情報