
cURLを介して外部API呼び出しを実行するシェル関数を作成しています。外部API構文は私が制御できません。私が処理する方法は次のとおりです(単純化)。
#!/bin/sh
template_get_entry='get_entry:%s'
template_set_entry='set_entry:%s=%s'
curlheaders='-H stuff'
curluri="https://www.domain.com:1234/api.php"
# make an API call to get entry "foo"
call_api "$template_get_entry" "foo"
# make an API call to set entry "foo" to "bar"
call_api "$template_set_entry" "foo" "bar"
call_api() {
apicmd="$( printf "$1" "$2" "$3" )"
result="$( eval "/usr/local/bin/curl" "$curlheaders" "-d" "$apicmd" "$curluri" )"
retcode="$?"
.....stuff.....
}
このコードには2つの問題があります。
まず、パラメータの数は可変です。apicmd
最大引数の数より少ない数で行定義が呼び出されると、printfは追加のコマンドを追加するフォーマット文字列の追加インスタンスを印刷すると解釈します。この問題を解決する正しい方法が表示されません。
eval
第二に、evalを使用しているため、これはevalに関連する問題を引き起こします。なぜなら、retcodeは確かにevalではなくevalから戻りコードを取得し、curl
問題を防止/修正する適切な方法を知らないからです。
可変数の引数を必要とするこのような作業をどのように実行する必要がありますか?
答え1
予想される引数の最大数までの長さゼロの指定子を使用して、書式文字列を埋めることができます。
template_get_entry='get_entry:%s %0.0s'
答え2
あなたができることは、フォーマット文字列パラメータを取得し、パラメータリストの外に移動し、次を使用することです$@
。
call_api () {
fmt=$1
shift
apicmd=$( printf "$fmt" "$@" )
# ...
}