パラメータを使用する関数をどのように作成しますか?
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 "$@"
引数が関数の動的範囲内のローカル変数になりたいので、関数呼び出しにすることはできませんtestfun
。getargs
しかしgetargs
小さい翻訳者a b c
パラメータ仕様をシェルに変換します。通事論、位置パラメータをローカル変数に入れるために手動で追加するコードを生成します。
たとえば、出力
getargs a b c
ソースコードは次のとおりです。
local a=$1; shift;local b=$1; shift;local c=$1; shift
そうすると、eval
見えるように動作します。呼び出し元のコンテキストで最初の3つの位置引数をa
、b
およびに入れてc
引数リストから移動します。
今、私たちは次のステップに進み、「素晴らしいもの」を追加できます。
まず、生成されたコードは次のようになります。確認する実際には3つの主張と診断があります。
オプションのパラメータをサポートできます。(getargs a b : c
またはその他)これは必須であることを意味できますが、a
オプションb
ですc
。末尾のパラメータもサポートできます。getargs a b : c . d
最初の2つのパラメータ(必須)をローカルに作成しa
、b
存在する場合は3番目のパラメータを入力できますc
。それ以降のすべての引数はd
Bash配列に入ります。
練習として残しておきます。
残念ながら、シェルにはマクロ拡張時間がありません。これの大きな欠点は、完全に静的であっても関数が呼び出されるたびにコードが生成されることです。
Awkのようないくつかのプリプロセッサを書くことによって、いくつかの名前付き関数構文砂糖を通常のシェルコードに変換することができます。