簡體   English   中英

提取shell腳本中的所有變量值

[英]Extract all variable values in a shell script

我正在調試舊的shell腳本; 我想檢查所有使用的變量的值,這是一個巨大的丑陋腳本,使用了大約140個變量。 無論如何我可以從腳本中提取變量名稱並將它們放在一個方便的模式中,如:

#!/bin/sh
if [ ${BLAH} ....
.....
rm -rf ${JUNK}.....

echo ${BLAH}
echo ${JUNK}
...

嘗試按如下方式運行腳本:

bash -x ./script.bash

或者在腳本中啟用該設置:

set -x

您可以使用以下命令將所有感興趣的變量轉儲到一

set | grep -w -e BLAH -e JUNK

要將所有變量轉儲到stdout使用:

set

要么

env

從你的腳本里面。

在bash中,但不是sh, compgen -v將列出所有已分配變量的名稱(將其與set進行比較,除了變量名之外還有很多輸出,因此需要進行解析)。

因此,如果將腳本頂部更改為#!/bin/bash ,則可以使用compgen -v生成該列表。

也就是說,建議你使用set -x做得很好。 考慮這個擴展:

PS4=':$BASH_SOURCE:$LINENO+'; set -x

這將在執行的每個命令(或變量賦值)之前打印源文件和行號,因此您將不僅記錄設置了哪些變量,而且記錄了每個變量的分配位置。 這使得跟蹤每個變量設置更容易。

您可以使用grep提取腳本中聲明的變量的(子)列表:

grep -Po "([a-z][a-zA-Z0-9_]+)(?==\")" ./script.bash | sort -u

免責聲明:為什么“子列表”?

給定的表達式將匹配字符串,后跟一個egal符號( = )和一個雙引號( " )。所以,如果你不使用myvar="my-value"這樣的語法,它將無效。但是你有了這個想法。

grep選項

  • -P --perl-regexp :將PATTERN解釋為Perl正則表達式(PCRE,見下文)( 實驗性 );
  • -o --only-matching :僅打印匹配行的匹配(非空)部分,每個部分位於單獨的輸出行上。

圖案

我正在使用一個積極的前瞻(?==\\")要求一個標志后跟一個雙引號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM