有没有办法打印在 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)
命令set
或declare
它们本身将打印所有 shell 变量及其值(并且还会输出函数定义)。declare -p
不会输出函数定义,但会用其类型注释每个变量(例如-r
,只读、-a
数组等)。该export
命令本身将打印环境变量(导出的 shell 变量),就像env
和 一样printenv
。
是否变量被用于当前shell会话内与否并不一定在这些命令的输出来检测。该bash
壳体具有许多变量存在于任何shell会话,如RANDOM
和EUID
,无论这些使用与否。一个变量在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)
需要注意的是,宣布name
为local
在函数的变量会,因为它不提供第二个电话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)
归档时间: |
|
查看次数: |
4191 次 |
最近记录: |