Bashスクリプトで使用されているすべての変数を印刷します。

Bashスクリプトで使用されているすべての変数を印刷します。

Bashスクリプトで宣言され使用されているすべての変数を印刷する方法はありますか?

たとえば、printf "%s\n" "${FUNCNAME[@]}"現在実行中の呼び出しスタック内のすべてのシェル関数の名前が印刷されます。

たとえば、次のようになります。私のスクリプトの内容は次のとおりです(宣言された変数がたくさんあるはずです)。

#!/bin/bash

say_hello() {
    name="$1"
    echo "Hello $name"
}

my_name="Luis Daniel"
my_age="29"

say_hello "$my_name"

次に、次のように記録する必要があります。

my_name = Luis Daniel
my_age = 29
name = Luis Daniel

ベストアンサー1

これらのコマンドsetまたはdeclareそれ自体は、すべてのシェル変数とその値を印刷します(関数定義も印刷します)。declare -p関数定義は印刷されませんが、各変数には対応する型(-r読み取り専用、-a配列など)がコメントとして追加されます。コマンド自体は、exportと同様に環境変数(エクスポートされたシェル変数)を印刷します。envprintenv

変数かどうか使用されるあるいは、現在シェルセッション内にないことがこれらのコマンドの出力で必ず検出されるわけではありません。シェルにはbash次のような多くの変数があります。どのRANDOM使用するかEUIDどうかにかかわらず、シェルセッション。declare呼び出し時に現在のスコープで変数を使用できない可能性があります。たとえば、関数のローカル変数であるか、すでに存在しているか、アクティブになっていないサブシェルunsetで宣言されているとします。

特定のスクリプトで生成された変数を表示するには、たとえばスクリプトの先頭に出力を保存し、スクリプトのdeclare -p最後(またはどこにいても)で同じコマンドの他の呼び出しと比較する必要があります。現在の宣言変数を調べたい)

例:

#!/bin/bash

tmpfile=$(mktemp)
declare -p >"$tmpfile"

say_hello() {
    name="$1"
    echo "Hello $name"
}

my_name="Luis Daniel"
my_age="29"

say_hello "$my_name"

declare -p | diff "$tmpfile" -
rm -f "$tmpfile"

実行してください:

$ bash script.sh
Hello Luis Daniel
46c46,49
< declare -- _=""
---
> declare -- _="Luis Daniel"
> declare -- my_age="29"
> declare -- my_name="Luis Daniel"
> declare -- name="Luis Daniel"

関数で変数として宣言すると、次のようにnameなります。localdeclare -p

Hello Luis Daniel
46c46,48
< declare -- _=""
---
> declare -- _="Luis Daniel"
> declare -- my_age="29"
> declare -- my_name="Luis Daniel"

おすすめ記事