型文字列が変数にあり、固定数のフィールドプレースホルダを持たないシェル 'printf'を使用しますか?

型文字列が変数にあり、固定数のフィールドプレースホルダを持たないシェル 'printf'を使用しますか?

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'

おすすめ記事