探してみましたが、答えが見つからず、もし前に質問された方がいらっしゃったら、あらかじめお詫び申し上げます。
私はFreeBSDでシェルを使用しています(/bin/sh
そしてすべてのシェルを標準出力にダンプしたいです(いいえ_myvar_
私が得ることができる最も近いものですが、set | grep '^_myvar_'
いくつかの行変数の最初の行だけをダンプします(一部は複数行であり、変数全体が必要です)、次のような病理学的に極端な場合はエラーが発生する可能性があります。 "文字列を含めるマワル「これはそのセクションの改行の直前に発生します。
(値の代わりに)変数名のみをリストできる場合は、aをフィルタリングして名前がdo...read...while
一致する変数の値を一度に取得できますが、これを行う方法を見つけることはできません。また、出力行に連続変数または新しい変数が含まれているかどうかを知るための明確な方法がないため、出力全体をフィルタリングすることはできません。これは_myvar_
、文字=
またはnewline (\n)
末尾の文字を含む文字列に対する極端な問題空間を表しません。 。コードが別のコード内に含まれており、環境がこれに対して安定している必要があるため、環境を変更したくありません。
役に立つと、出力/リストに一致する環境変数が含まれていることは問題になりません(存在する場合は可能性は非常に低いです)。
これを行う方法はありますか?
ベストアンサー1
set
FreeBSDの組み込みsh
出力形式はシェルに再入力するのに適しているため、次のことができます。
out() case $1 in (_myvar_*) printf '%s\n' "${1%%=*}"; esac
eval "$(set | sed 's/^/out /')"
つまり、set
出力される各行にを付けて"out "
シェルコードで評価します(ここでは、out
最初の引数の部分文字列を最初の引数に印刷する関数です=
)。
sed
複数行変数の内容も挿入されますが、関数が最初の変数の後に受け取る引数には"out "
まだ含まれているため、表示しない部分に含まれます。out
=
たとえば、set
次の出力の場合:
TERM=xterm
USER=stephane
_myvar_foo='line1
line2
line3'
私達は以下を評価します:
out TERM=xterm
out USER=stephane
out _myvar_foo='line1
out line2
out line3'
out
しかし、この3つの変数は3回しか呼び出されないため、それでも問題はありません。
変数名と値を印刷するには:
out() case $1 in (_myvar_*)
eval 'printf "name: \"%s\" value: \"%s\"\n" "${1%%=*}" "${'"${1%%=*}"'}"'
esac
eval "$(set | sed 's/^/out /')"
出力のみですので参考にしてください変わりやすい、位置パラメータなどの他の種類のパラメータの代わりに$-
...
sh
この方法は出力専用の実装でのみ使用できます。set
スカラー変数(配列、関連配列、複合変数には適用されず、out var=(x)
構文エラーになります)。異なる変数タイプを持つシェルは通常、より良いセルフチェック機能を持ちます。
存在するzsh
:
typeset -pm '_myvar_*'
またはちょうど名前のため
echo $parameters[(I)_myvar_*]
存在するbash
:
v=("${!_myvar_@}"); ((${#v[@]})) && typeset -p -- "${v[@]}"
echo "${!_myvar_@}"