bash 関数で小文字のシェル変数を表示するには、awk を使用します。

bash 関数で小文字のシェル変数を表示するには、awk を使用します。

結果

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

私の初期のアプローチはbashawkコマンドは関数として定義されます。、動作します。もともと定義した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[@]}"

たとえば、すべて小文字です。

grepgrep -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宣言された未割り当て変数は含まれません。

おすすめ記事