bashを仮定しましょうシェルスクリプト良い:
#!/bin/bash
a=3
b=7
set -o posix
set
この場合は、変数set
または他のコマンドを実行してください。環境変数の印刷( env
, declare
... など) mya
とb
変数と a を出力します。多くの変数(および機能)は環境(PATH
、、、PWD
...TEMP
など)から来ます。
すでに存在する変数だけを印刷する方法はありますか?スクリプト中に定義体?
答え1
スクリプトの先頭に変数リストを保存し、スクリプトのどこかにある値と比較できます。同様のコマンドの出力はset
明確ではありません。同様のコマンドは、set | sed 's/=.*//'
値に改行文字を含む変数では機能しません。 (Bashでは実際には文字列変数に対しては機能しますが、配列には機能しません。関数コードも表示します。)
variables=$(tmp=$(declare -p +F); declare () { echo "${2%%=*}"; }; eval "$tmp")
したがって、initial_variables=…
スクリプトの先頭に設定し、後で値と比較してください。echo
リストで直接作業することに加えて、他の方法を使用できます。
initial_variables=" $(tmp=$(declare -p +F); declare () { echo "${2%%=*}"; }; eval "$tmp") "
…
( tmp=$(declare -p +F)
declare () {
case "$initial_variables" in
*" $2 "*) :;; # this variable was present initially
*) eval "set -- \"\$$2\" \"\$2\""; echo "locally defined $2=$1";;
esac
}
)
答え2
私はトリックを書いた。リストしたくない変数の名前を「aaa」(他のファイルから取得したものと同じ)文字で始まる変数に変更し、組み込みコマンドを呼び出しましたcompgen -v
。それから私は押します数字私はスクリプトに存在する変数を知っています。
たとえば、別のファイルからaaaで始まる2つの変数があり、私のスクリプトにはランダムに名前が付けられた3つの変数があります(最初の文字の範囲は最初から最後まで)、この単純なコマンドをスクリプトに入力すると、出力に次の3つの変数のみを一覧表示できます。
compgen -v | tail -n 3
編集する:
スクリプトにいくつかの変数があるかどうかわからない場合は、次のようにします。
compgen -v | awk '$0 == "aaauser" {i=1;next};i && i++ <= 100'
どこAAAユーザー~である最後に、アルファベット順別のファイルから取得した変数です。既知の変数に適用できます。
答え3
comm
、手続き型置換を使用した2行戦略compgen -v
...
ENVVARS="$(compgen -v)"
:
<script>
:
comm -1 -3 <(sort <<< "$ENVVARS") <(compgen -v | sort)
からcomm --help
...
Usage: comm [OPTION]... FILE1 FILE2
Compare sorted files FILE1 and FILE2 line by line.
With no options, produce three-column output. Column one contains
lines unique to FILE1, column two contains lines unique to FILE2, and
column three contains lines common to both files.
-1 suppress lines unique to FILE1
-2 suppress lines unique to FILE2
-3 suppress lines that appear in both files
このcomm
コマンドを使用すると、スクリプトの最後にある環境変数全体からスクリプトに渡された環境変数のセットを「減算」でき、スクリプトによって生成された環境変数のみを残します。
オプション-1と-3は、このスクリプトで生成された変数(「ファイル2」の行など)を除くすべての変数を削除します。 Bashプロセス置換は、<(...)
変数をリストしてソートし、出力をファイルとして処理するために使用されます。
関数に対してローカルに宣言された変数は、基本スクリプトの範囲外であるため、含まれません。
同じ手法を使用して、関数内で生成された変数を一覧表示できます。ただし、この場合、(_)
アンダースコアで始まる変数名を指定し、呼び出しの前にアンダースコアを付けるルールがcompgen
より理想的になる可能性があります。
LOCALVARS="$(compgen -v _)"
答え4
現在定義されているすべての変数名のソートされたリストを取得する移植可能な方法は次のとおりです。
v(){ set "${IFS+IFS=\$2}" "$IFS"; unset IFS
set $(set|sed -n '/^[_[:alpha:]][[:alnum:]]*=/s/=.*//p'|sort -u) "$@"
while [ "$#" -gt 2 ]
do eval '[ "${'$1'+1}" = 1 ]' &&
echo "$1"; shift
done; eval "$1"
}
リストは標準出力echo
として編集されますv()
(1行に1つずつ)。 edなので、sort
後で同様に生成されたリスト(使用または類似など)と比較できる良い候補ですcomm
。このリストは意図的に除外されました$IFS
。その理由は、-が設定されているか設定されていないためです$IFS
。いつもしたがって、実際にはそのようなリストに含める必要があります。次のように変更できます。
set "${IFS+IFS=\$2}" "$IFS"; IFS='
'; set $(set|...
...しかしそれは永遠です。含む設定するかどうかにかかわらず、リストにあります。前のポイントに戻ります。