Bash ブレース展開チュートリアル:ブレース内で式を展開する 6 つの例
Bash シェルの拡張
入力を解析する際のシェルの動作の一つにシェル展開があります。 Bash はさまざまなタイプの拡張を提供します。この記事では、重要な展開である「ブレースの展開」を確認します。
この記事は、進行中の Bash チュートリアル シリーズの一部です。
ブレース拡張
ブレース展開は、任意の文字列を生成するために使用されます。ブレース展開を使用すると、1 つの引数から複数の変更されたコマンド ライン引数を作成できます。指定された文字列は、オプションの周囲のプリアンブルおよびポストスクリプトとのすべての可能な組み合わせを生成するために使用されます。プリアンブルは、中括弧内に含まれる各文字列の前に付けられ、その後、ポストスクリプトが結果の各文字列に追加され、左から右に展開されます。
$ echo last{mce,boot,xorg}.log lastmce.log lastboot.log lastxorg.log where last is Preamble and .log is the postscript
上記の echo ステートメントにより、3 つのログ ファイルを個別に指定する必要がなくなります。最後のブート ログ、mce ログ、および xorg ログの内容を表示する場合は、上記の echo ステートメントに示されているように、ブレース展開を使用できます。
1.ブレース展開を使用したバックアップの例
$ cat bkup.sh set -x # expand the commands da=`date +%F` cp $da.log{,.bak} $ ./bkup.sh ++ date +%F + da=2010-05-28 + cp 2010-05-28.log 2010-05-28.log.bak
上記のバックアップ スクリプトでは、現在の日付のログ ファイルを拡張子 .bak でコピーします。最初の要素は波括弧内が空であるため、最初の要素にはプリアンブルのみが含まれます。
2.ブレース展開を使用した復元の例
$ cat restore.sh set -x # expand the commands da=`date +%F` cp $da.log{.bak,} $ ./restore.sh ++ date +%F + da=2010-05-28 + cp 2010-05-28.log.bak 2010-05-28.log
復元スクリプトでは、パラメーターの最初の要素は .bak で、2 番目の要素は空です。
また、詳細については、bash シェル関数に関する以前の記事を参照してください。
<センター> センター>3.プリアンブルとポストスクリプトなしのブレース拡張の例
プリアンブルとポストスクリプトがない場合は、中かっこで指定された要素を展開するだけです。
$ cat expand.sh echo {oct,hex,dec,bin} $ ./expand.sh oct hex dec bin
オプションのプリアンブルとポストスクリプト文字列がない場合、結果は指定された文字列のスペース区切りのリストになります
範囲のブレース拡張
ブレース展開はシーケンスも展開します。シーケンスは整数または文字にすることができます。
4.整数と文字シーケンスの例
$ cat sequence.sh cat /var/log/messages.{1..3} echo {a..f}{1..9}.txt $ ./sequence.sh May 9 01:18:29 x3 ntpd[2413]: time reset -0.132703 s May 9 01:22:38 x3 ntpd[2413]: synchronized to LOCAL(0), stratum 10 May 9 01:23:44 x3 ntpd[2413]: synchronized to May 9 01:47:48 x3 dhclient: DHCPREQUEST on eth0 May 9 01:47:48 x3 dhclient: DHCPACK from 23.42.38.201 .. .. a1.txt a2.txt a3.txt a4.txt b1.txt b2.txt b3.txt b4.txt c1.txt c2.txt c3.txt c4.txt
最初の cat コマンドは、messages.1、messages.2、messages.3 を展開し、内容を表示します。次の echo ステートメントでは、文字と整数のシーケンスが組み合わされて使用されます。
増分値を持つシーケンス
kshell ブレース展開では、インクリメント値を使用してシーケンスを生成できます。
Syntax: <start>..<end>..<incr>
incr は数値です。負の整数を使用できますが、正しい符号は開始と終了の順序から推測されます。
5.シーケンスでインクリメントを使用する例
$ ksh $ echo /var/log/messages.{1..7..2} /var/log/messages.1 /var/log/messages.3 /var/log/messages.5 /var/log/messages.7 $
これを使用すると、1 日おきのログファイルを見ることができます。
ブレース展開の落とし穴
ブレース展開は bash 変数を展開しません。ブレース展開はシェル展開の最初のステップであり、変数は後で展開されるためです。
6.展開中の変数の例
次の 2 つの for ステートメントの出力を見ると、上記の落とし穴を特定できます。
$ cat var_seq.sh # Print 1 to 4 using sequences. for i in {1..4} do echo $i done start=1 end=4 # Print 1 to 4 using through variables echo "Sequences expressed using variables" for i in {$start..$end} do echo $i done $ ./var_seq.sh 1 2 3 4 Sequences expressed using variables {1..4}
-
Bash 変数チュートリアル – 6 つの実用的な Bash グローバル変数とローカル変数の例
この記事は、進行中の bash チュートリアル シリーズの一部です。他のプログラミング言語と同様に、Bash にも変数が用意されています。 Bash 変数は、プログラムの存続期間中に必要となる情報を一時的に格納します。構文: VARNAME=VALUE 注: 変数の割り当てでは、「=」記号の周りにスペースを入れないでください。 VAR=VALUE を使用すると、シェルは「=」を記号として認識し、コマンドを変数割り当てとして扱います。 VAR =VALUE を使用すると、シェルは VAR がコマンドの名前であると想定し、それを実行しようとします。 シェルは変数の型を気にしません。変数には、
-
5 つの実用的な例を含む Bash スクリプト入門チュートリアル
進行中の Unix Sed および Unix Awk シリーズと同様に、Bash スクリプトに関するいくつかの記事を投稿します。実用的な例ですべての bash スクリプト テクニックをカバーします。 シェルは、ユーザー コマンドを解釈するプログラムです。コマンドは、ユーザーが直接入力するか、シェル スクリプトと呼ばれるファイルから読み取るかのいずれかです。ユーザーからの入力を直接読み取る場合、シェルは対話型シェルとして呼び出されます。 シェルは、ファイルからコマンドを読み取って実行するときに、非対話型シェルとして呼び出されます。この場合、シェルはスクリプト ファイルの各行を上から下に読み取