この例のように、定義された変数に関数パラメータを「注入」する方法は?
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"
printf
1つ以上の引数を受け入れます。そのうちの最初の引数は次のとおりです。変化のないプレースホルダを含めることができ、プレースホルダが参照するパラメータの残りの部分で出力形式を記述する文字列。
メッセージが静的フォーマット文字列の場合は、以下を使用してください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
これを防ぐために前のバックスラッシュを使用できます)。$
`
e
orなどのリスクを回避するもう1つの方法はsをeval
使用することです。ここで置き換える項目を正確に指定できます。gettext
envsubst
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
順序を逆にすることもできます。他の実装では、次のトリックを使用できます。ksh93
zsh
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
(幅がゼロに切り捨てられた文字列)を使用して、他の順序で使用したくないパラメータを削除します。