
変数名を入力として使用する関数を作成したいと思います(superEchoと呼びます)。関数は変数の名前とその値を印刷する必要があります。
function superEcho
{
echo "$1: ?????"
}
var=100
superEcho var
このスクリプトを返したいです。
var: 100
ちなみにsuperEcho関数で「???」代わりに何を使うべきかわかりません。
答え1
POSIX的に:
superEcho() {
eval 'printf "%s\n" "$1: ${'"$1"'}"'
}
bash
-specと同様に、削除されたと${!var}
予想され、有効な変数名が含まれています。$1
そうしないと、ランダムなコマンド注入の脆弱性になります。
関数でクリーンアップを実行できます。
superEcho() {
case $1 in
("" | *[!_0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]* | [0123456789]*)
printf >&2 'Invalid variable name: "%s"\n' "$1"
return 1;;
(*) eval 'printf "%s\n" "$1: ${'"$1"'}"'
esac
}
型変数の場合大量にまたは連想配列、inbash
またはksh
(POSIXsh
には配列はありませんが、"$@"
関数自体のパラメータなので、ここでは使用できません。superEcho
)インデックス要素の値のみを印刷します0
が、inではzsh
次のように出力されます。価値の最初の文字$IFS
(およびのSPC文字yash
)です。
ksh
、またはzsh
(配列bash
をyash
サポートする4つのBourne様シェル)。typeset -p var
変数定義と属性の印刷も参照してください。
答え2
使用${!variablename}
:
function superEcho
{
printf '%s: %s\n' "$1" "${!1}"
}
答え3
私は別の方法でする。私はしばしば、電子メール、ログ、またはフラグ(ディスクに記録されている)に変数名を使用して、1つのデバイスに属するすべてが同じ方法で名前を付けるようにしたいと思います。つまり、変数名を基本として使用します。
RPiZero=10
ReadRPiTemp ()
{
eval ReadSegment='$'$1
echo "variable content: $ReadSegment"
echo "variable name: $1"
}
ReadRPiTemp RPiZero
# NOT ReadRPiTemp "$RPiZero"
上記はshとbashで動作します。私は仕事でshの互換性が必要なので、Bashで同じことを行う正しい方法を見落としました。
RPiZero=10
ReadRPiTemp ()
{
declare -n ReadSegment=$1
echo "variable content: $ReadSegment"
echo "variable name: $1"
}
ReadRPiTemp RPiZero
# NOT ReadRPiTemp "$RPiZero"
上記の両方とも同じ結果を印刷します。
variable content: 10
variable name: RPiZero