結果
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
宣言された未割り当て変数は含まれません。
答え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"キーワードを削除しましたが、引き続き機能しました。 - 頭を傷つけてください。これが誰かの時間を無駄にした場合は謝罪します。