私はBash関数に似ているようですが、関数ではなくある種のデータ構造が欲しいです。 ㅏ名前付きコマンドをコンテキストに合わせて設定し、前のタブも許可する必要があります。
ファイルに20個のBash関数が含まれているが、20行の関数呼び出しが必要ない場合は問題ありません。
比較する:
ヘビーヒート機能:
x() {
echo "x"
}
x
私が探しているデータ構造は次のとおりです。
context {
echo "x"
}
これらのデータセルでコマンドを設定する方法は、関数を使用してコマンドを設定する方法と似ていますが、パラメータの角かっこや()
関数呼び出しはありません。
この構造の名前は何ですか?あなたは何をしますか?
ノート
構造の名前は、関数と同じように、常に同じ行に先行する必要があります。
ドキュメントはここでは解決策ではありません。この場合、構文を通じてより簡単なことを達成することを望んでいます。
答え1
それはaと呼ばれます。複合コマンド構文は次のとおりです。
{ compound-list; }
(これは花です。はい複合コマンド、ループなどの他のコマンドfor
も複合コマンドです)
たとえば、
{
echo 'hello'
echo 'world'
}
;
最後の行の前に改行文字がない場合にのみ必要です}
。
{ echo 'hello'; echo 'world'; }
コンストラクタのコマンド{ ...; }
は現在の環境は関数と同じです。
これについて詳しくは、次をご覧ください。複合コマンドのPOSIX標準記述。
これらの部分に名前を付ける理由(または可能性)はありません。なぜなら、これらの部分の名前を指定するのはシェル関数を生成するのとほぼ同じです。また、複合コマンドの名前を指定することは、後で複合コマンドを参照するときにのみ必要です。これは機能の目的です。
明らかにコメントを使用できます。
# my hello world thing
{
echo 'hello'; echo 'world'
}
同様に、サブシェルには次のものがあります。
(
echo 'hello'
echo 'world'
)
これは現在のシェルのサブ環境で実行され、変数などの変更はいいえ現在のシェルに反映されます。
一般的な構文は次のとおりです。
( compound-list )
;
ここでは以前は決勝戦は必要ありませんでした)
。
奇妙なことに、シェル関数を(...)
代わりに使用して{...;}
ローカル環境でコードを実行できます。
helloworld () (
echo 'hello'
echo 'world'
)
sh
local
これは、ローカル変数(またはtypeset
)をサポートせず、スクリプト環境の変更を必要としない言語で関数を作成する場合にbash
便利です。
答え2
コメントは十分ですか?
次のようにコマンドを再グループ化し、グループに名前を付けるために使用できます。インデントの使用を禁止することはありません。
#context1
echo "I'm in context1"
#end of context1
#context2
echo "I'm in context2"
#end of context2
regroupコマンドを使用することもできます{...}
。私が知る限り、この場合には他の効果はありません。
#context1
{
echo "I'm in context1"
}
#end of context1
{ #context2
echo "I'm in context2"
} #end of context2
これらのコンテキストをローカルスコープに関連付けたい場合は、サブシェルを使用できます。
#context1
(
context="context1"
echo "I'm in $context"
)
#end of context1
( #context2
echo "I'm in $context" #context is undefined there
context=context2
echo "I'm in $context"
) #end of context2