打印 bash 脚本中使用的所有变量

打印 bash 脚本中使用的所有变量

有没有办法打印 Bash 脚本中声明和使用的所有变量?

例如,printf "%s\n" "${FUNCNAME[@]}"将打印当前执行调用堆栈中的所有 shell 函数的名称。

例如:这是我的脚本内容(肯定有很多声明的变量):

#!/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

这些命令setdeclare它们本身将打印所有 shell 变量及其值(并且还会输出函数定义)。declare -p不会输出函数定义,但会用其类型注释每个变量(例如,-r只读、-a数组等)。该export命令本身将打印环境变量(导出的 shell 变量),就像 和env一样printenv

变量是否为用过的或不在当前 shell 会话内不一定会在这些命令的输出中检测到。 shellbash有许多变量存在于任何shell 会话,例如RANDOMEUID,无论是否使用它们。declare调用时,变量也可能在当前作用域中不可用,例如,如果它是函数中的局部变量,或者它已经是unset,或者如果它是在不再活动的子 shell 中声明的。

如果您想查看在特定脚本中创建的变量,则必须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"

相关内容