定義された変数に関数パラメータを渡す

定義された変数に関数パラメータを渡す

この例のように、定義された変数に関数パラメータを「注入」する方法は?

mood="i am $1 happy"

happy ()
{
    echo "$mood"
}

happy "very"

現在の出力:

i am  happy

希望の出力:

i am very happy

ありがとうございます!

編集する:

実際の例:他のファイルには、次のような翻訳可能な文字列がたくさんあります。

installing="Installing"
installation_started="The installation of <app> started at <date>"
installation_ended="The installation of <app> ended at <date>"

次の機能もあります。

apt_get_install ()
{
    echo "$installing $1..."
    echo "$installation_started"
    apt-get -y install "$1"
    echo "$installation_ended"
}

apt_get_install <app>

<app>それから出力に注入したいと思います。

答え1

これはうまくいきます。非常に注意evalし、ユーザー入力に使用しないでくださいeval。どんな作業でも行われます。

mood='i am $1 happy'

happy ()
{
    eval echo "$mood"
}

happy "very"

答え2

さまざまな言語でユーザーに情報メッセージを提供したいと思います。これを正しく行うには、この目的のために特別に設計されたソフトウェアを使用する必要があります。 GNUの世界には次のものがあります。gettextこれはあなたに役立ちます。 (これは解決すべき小さな問題ではありません!)

以下のテキストは、更新前の質問と更新後の質問の一部を説明しています(翻訳の提供に関するメッセージであることを知る前に)。


あなたの関数は単なるエイリアスなので、あなたの例はあまり意味がありませんecho。簡単にhappy関数を呼び出すことができます。

happy "I am $adjective happy"   # $adjective would be the string "very"

printfそれ以外にも標準関数も役に立ちます。

adjective='very'
printf 'I am %s happy\n' "$adjective"

printf1つ以上の引数を受け入れます。そのうちの最初の引数は次のとおりです。変化のないプレースホルダを含めることができ、プレースホルダが参照するパラメータの残りの部分で出力形式を記述する文字列。


メッセージが静的フォーマット文字列の場合は、以下を使用してくださいprintf

apt_get_install ()
{
    printf 'Installing %s...\n' "$1"
    printf '%s installation started at %s\n' "$1" "$(date)"
    apt-get -y install "$1"
    printf '%s installation ended at %s\n' "$1" "$(date)"
}

apt_get_install thing

関連:

答え3

次のコードを試してください。

function happy ()
{
        mood="i am $1 happy"
        echo "$mood"
}

happy "very"

または、次のいずれかを試してください。

function happy ()
{
        echo "i am $1 happy"
}

happy "very"

答え4

そしてzsh

mood='I am $1 happy'

happy () {
  printf '%s\n' ${(e)mood}
}

happy very

パラメータ拡張フラグは、すべてのパラメータ拡張、算術拡張、およびコマンド置換が変数の内容内で評価されるようにします(またはeこれを防ぐために前のバックスラッシュを使用できます)。$`

eorなどのリスクを回避するもう1つの方法はsをeval使用することです。ここで置き換える項目を正確に指定できます。gettextenvsubst

mood='I am $HOWMUCH happy'
happy() {
  HOWMUCH=$1 envsubst <<< "$mood"
}
happy very

zshの拡張でもありますが、<<<bash

(または)のみが交換されていることを確認するには、にenvsubst交換します。envsubst '$HOWMUCH'$HOWMUCH${HOWMOUCH}

ksh93または を使用すると、zsh以下を使用することもできます。

mood='I am %1$s happy\n'
happy() {
  printf "$mood" "$@"
}

printf%1$s使用するパラメータ指定をサポートしていない他の実装では、この特別な場合に使用できます%s。型がある場合、%s %s最初のパラメータは%s最初のパラメータを取得し、2番目のパラメータは2番目のパラメータを取得します。またはを使用して%2$s %1$s順序を逆にすることもできます。他の実装では、次のトリックを使用できます。ksh93zsh

case $(locale language) in
  (*English*) msg="I am in a %s %s%.0s%.0s\n";     mood=mood;;
  (*French*)  msg="Je suis d'une %.0s%s %s%.0s\n"; mood=humeur;;
esac

mood() {
  printf "$msg" "$@" "$@"
}

mood formidable "$mood"

これはI'm in a formidable mood英語ユーザーとJe suis d'une humeur formidableフランス語ユーザーの両方に印刷されます。パラメータを2回渡し%.0s(幅がゼロに切り捨てられた文字列)を使用して、他の順序で使用したくないパラメータを削除します。

関連情報