結果
set
出力に表示されている変数を使用またはフィルタリングdeclare
する小文字の命名シェルこれはテスト時にシェル変数を設定する私のルールです。
はい
私は以下を設定しました:
$ declare -A pid=()
$ a=DHCP
$ something=test
出力が次のようになります。
$ lvar
a=DHCP
pids=()
something=test
この機能のためにawkコマンドを思いつきましたlvar
。
declare | awk -F'=' '$1 ~ /^[a-z]+$/'
コマンドラインから実行すると、うまく動作します。しかし、ソーシングされ実行される関数として、次のように発生したと思われるエラーが発生します。awkフィールドパラメータ $1
として説明されたbash関数パラメータ。
$ vi func
function lvar() {
declare |awk -F'=' '$1 ~ /^[a-z]+$/'
}
走るレヴァルこのエラーが発生します。
$ lvar
awk: cmd. line:1: ~ /^[a-z]+$/
awk: cmd. line:1: ^ syntax error
私がここで何を間違っているのか?
$ declare -p -f lvar
lvar ()
{
declare | awk -F'=' '$1 ~ /^[a-z]+$/'
}
アップデート1
私の初期のアプローチはbash
awkコマンドは関数として定義されます。、動作します。もともと定義したMacではなく、Linuxコンピュータでのみ動作します。
調べなければならないmacOSの問題そして時が来たらここに皆さんを更新します。
貴重な時間をありがとうございました:)
アップデート2
bash shopt
わかりました。 LinuxとmacOSでオプションが異なることを確認しましたが、そうではありません。
MacでiTermを開くと、機能は期待どおりに機能しますが、Terminal.appに出力が表示されません。
非常に奇妙なことに、Terminal.appのいくつかの設定にのみ適用されます。私は迷っています。
ベストアンサー1
を使用すると、bash
次のように変数名のリスト(宣言されていないが割り当てられていない名前)を配列に配置できます。
readarray -t Vars < <(compgen -v)
以下を使用してフィルタリングできますgrep
。
readarray -t Vars < <(compgen -v | grep -x '[[:lower:]]*') &&
[ "${#Vars[@]}" -gt 0 ] &&
declare -p -- "${Vars[@]}"
たとえば、すべて小文字です。
grep
grep -v '[[:upper:]]'
名前に大文字が含まれている変数、または小文字がgrep '[[:lower:]]' | grep -v '[[:upper:]]'
1つ以上含まれ、大文字が含まれていない変数を除くすべての変数に適用されるようにフィルタを変更します。
とにかく、変数値は複数行で構成される可能性が高く、表示されるためdeclare
(少なくとも)出力を1行ずつ後処理することはできません。スカラーとして)posix
オプションが有効になっている場合は、次のようになります。bash
var='line 1
line 2'
このオプションを無効にすると、5.1は各変数定義が1行になることを保証するため、少なくとも常に改行文字をレンダリングしているposix
ようです。bash
$'\n'
この場合、次のことができます。
(set +o posix; declare | grep -E '^[[:lower:]]+=')
名前がすべて小文字の変数の定義を一覧表示します(変数の値が十分に短いか、バイトgrep
より大きい行をブロックしないと仮定します)。LINE_MAX
for と同様に、compgen -v
宣言された未割り当て変数は含まれません。