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

Lui*_*iel 1 bash shell-script

有没有办法打印在 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"
Run Code Online (Sandbox Code Playgroud)

然后,我需要记录如下内容:

my_name = Luis Daniel
my_age = 29
name = Luis Daniel
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 6

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

是否变量被用于当前shell会话内与否并不一定在这些命令的输出来检测。该bash壳体具有许多变量存在于任何shell会话,如RANDOMEUID,无论这些使用与否。一个变量在declare被调用时也可能在当前范围内不可用,例如,如果它是函数中的局部变量,或者它已经存在unset,或者它是在不再活动的子 shell 中声明的。

您是否想查看在特定脚本中创建的变量,您必须declare -p在脚本开始时保存 eg 的输出,然后将其与脚本末尾(或您所在的任何地方)对同一命令的另一个调用进行比较我想调查当前声明的变量)。

例子:

#!/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"
Run Code Online (Sandbox Code Playgroud)

运行它:

$ 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"
Run Code Online (Sandbox Code Playgroud)

需要注意的是,宣布namelocal在函数的变量会,因为它不提供第二个电话declare -p,产生

Hello Luis Daniel
46c46,48
< declare -- _=""
---
> declare -- _="Luis Daniel"
> declare -- my_age="29"
> declare -- my_name="Luis Daniel"
Run Code Online (Sandbox Code Playgroud)