GNU/Linux >> Linux の 問題 >  >> Linux

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}

Linux
  1. Bashブレースの拡張と変数?

  2. 例を含む Bash If-Else ステートメント

  3. 実際の例を含む Bash シェルの終了ステータスのチュートリアル

  1. 簡単なBash完了チュートリアル??

  2. `〜#`はバッシュのチルダ拡張ですか?

  3. 知っておくべき15のLinux Bash履歴拡張の例

  1. 15 の例を含む究極の Bash Array チュートリアル

  2. 6 Bash 条件式の例 ( -e, -eq, -z, !=, [, [[ ..)

  3. The Magic ~:5 つの例を使用した Bash Tilde 拡張