在我的bash脚本中,有很多变量,我必须做些什么来将它们保存到文件中.我的问题是如何列出我的脚本中声明的所有变量并得到如下列表:
VARIABLE1=abc
VARIABLE2=def
VARIABLE3=ghi
Dou*_*der 142
set 将输出变量,遗憾的是它也将输出定义的函数.
幸运的是POSIX模式只输出变量:
( set -o posix ; set ) | less
管道less,或重定向到您想要的选项.
因此,要获取仅在脚本中声明的变量:
( set -o posix ; set ) >/tmp/variables.before
source script
( set -o posix ; set ) >/tmp/variables.after
diff /tmp/variables.before /tmp/variables.after
rm /tmp/variables.before /tmp/variables.after
(或至少基于此的东西:-))
小智 39
compgen -v
它列出了所有变量,包括本地变量.我从bash中学到了它:获取名称与某个模式匹配的变量列表,并在我的脚本中使用它.
ako*_*nov 10
for i in _ {a..z} {A..Z}; do eval "echo \${!$i@}" ; done | xargs printf "%s\n"
这必须打印所有shell变量名称.您可以在获取文件之前和之后获取列表,就像使用"set"来区分哪些变量是新的(如其他答案中所述).但请记住,使用diff进行过滤可以过滤掉您需要但在获取文件之前存在的一些变量.
在您的情况下,如果您知道变量的名称以"VARIABLE"开头,那么您可以获取脚本并执行以下操作:
for var in ${!VARIABLE@}; do
   printf "%s%q\n" "$var=" "${!var}"
done
更新:对于纯BASH解决方案(不使用外部命令):
for i in _ {a..z} {A..Z}; do
   for var in `eval echo "\\${!$i@}"`; do
      echo $var
      # you can test if $var matches some criteria and put it in the file or ignore
   done 
done
如果您可以进行后处理(如前所述),您可能只需set在脚本的开头和结尾处进行调用(每个调用到不同的文件)并对两个文件进行比较。请注意,这仍然会包含一些噪音。
您也可以通过编程来执行此操作。要将输出限制为当前范围,您必须实现变量创建的包装器。例如
store() {
    export ${1}="${*:2}"
    [[ ${STORED} =~ "(^| )${1}($| )" ]] || STORED="${STORED} ${1}"
}
store VAR1 abc
store VAR2 bcd
store VAR3 cde
for i in ${STORED}; do
    echo "${i}=${!i}"
done
哪个产量
VAR1=abc
VAR2=bcd
VAR3=cde
小智 5
基于上述一些答案,这对我有用:
before=$(set -o posix; set | sort);
源文件:
comm -13 <(printf %s "$before") <(set -o posix; set | sort | uniq) 
| 归档时间: | 
 | 
| 查看次数: | 71309 次 | 
| 最近记录: |