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

答え2

そしてzsh

set -o extendedglob
typeset -m '[[:lower:]]#'

名前がすべて小文字で構成される変数の定義を印刷します。

set -o extendedglob
typeset -m '^*[[:upper:]]*'

大文字が含まれていないコンテンツの場合foo_barまたはvar1等も含まれます。

set -o extendedglob
typeset -m '*[[:lower:]]*~*[[:upper:]]*'

1 つ以上の小文字が含まれ、大文字は含まれない変数の場合は、名前付き__変数_123_を除外します。手紙以前に比べて小文字や大文字の形はありません。

zshこれらの変数の多くが定義されています。

答え3

さて、私の機能方法は動作します。いくつかありますクレイジー Terminal.app の問題これは機能とは何の関係もありません。

から:

$ vi ~/.bash_functions
lvar() {
  declare |awk -F'=' '$1 ~ /^[a-z]+$/'
}

到着する:

$ vi ~/.bash_functions
function lvar() {
  declare |awk -F'=' '$1 ~ /^[a-z]+$/'
}

問題を正確に見つけることができたらと思いますが、動作が始まりました。ターミナルプログラム長い関数を使って型を定義した後機能キーワードは、私のデフォルトのbash関数ファイルでTerminal.appを閉じて再び開きます。ねえ、さあ、成功しました!その後、デフォルトのbash関数から "function"キーワードを削除しましたが、引き続き機能しました。 - 頭を傷つけてください。これが誰かの時間を無駄にした場合は謝罪します。

関連情報